docs: expand Iluvatar deployment and validation guide
面向天数智芯(Iluvatar)GPU 的 YOLO 训练、推理与运维监控平台。同一套代码可以在智铠 100(MR-V100)和天垓 150(BI-V150)实例上运行,通过运行时探测选择卡型策略,不为不同型号复制训练 runner、监控器或前端页面。
系统提供 Web UI、FastAPI API 和 MCP Server,可完成 GPU 状态采集、数据集与模型管理、YOLO 训练、图片/视频推理、任务日志和 AI 辅助运维。GPU 指标来自 ixsmi,训练和推理通过天数智芯 CoreX PyTorch 执行。
ixsmi
本项目基于 MetaX GPU Ops Agent 迁移和适配。
项目已在模力方舟的天数智芯 GPU 容器实例中完成双卡实测。以下数值来自实际运行环境,不用产品规格页数值代替运行时探测结果。
/data
root
/usr/local/corex-4.4.0/lib64/python3/dist-packages/torch/__init__.py
nvidia-smi
ix-smi
/data/Iluvatar-gpu-ops-agent
/data/yolo_models
/data/datasets
/data/yolo_jobs
/data/yolo_jobs.db
/data/ultralytics-src
.logs/api.log
.logs/mcp.log
.logs/web.log
.logs/deploy.log
cuda:0
false
true
显存、设备数量和设备名由 ixsmi 与 torch.cuda 实时读取。即使规格文档给出不同显存,也以当前实例实际暴露的数值为准。
torch.cuda
ixsmi 中的 CUDA Version 表示 IX-ML/CoreX 提供的 CUDA 兼容接口版本,不表示实例安装了 NVIDIA CUDA Toolkit。项目使用 PyTorch 的 torch.cuda 兼容命名空间访问天数智芯设备,因此 torch.cuda.is_available() == True 和设备名为 Iluvatar 才能证明计算链路可用;只看到 ixsmi 的版本字段不能证明 YOLO 可以训练。
CUDA Version
torch.cuda.is_available() == True
天数智芯镜像已经提供与驱动匹配的 CoreX PyTorch。项目虚拟环境必须继承系统包:
python3 -m venv --system-site-packages .venv source .venv/bin/activate
deploy.sh 和 start.sh 都按此方式创建 .venv。requirements.txt 不声明 torch、torchvision、torchaudio 或 triton,安装逻辑还会再次过滤这些包,防止 PyPI 公版覆盖 CoreX 版本。
deploy.sh
start.sh
.venv
requirements.txt
torch
torchvision
torchaudio
triton
不要执行以下操作:
pip install torch torchvision torchaudio pip install --upgrade torch
公版 PyTorch 即使能够导入,也通常不能加载 IX-ML/CoreX 运行库,会造成 torch.cuda.is_available() == False、计算卡死或运行时符号冲突。
torch.cuda.is_available() == False
numpy>=1.26,<2
torch.from_numpy
opencv-python==4.6.0.66
opencv-python-headless==4.6.0.66
typing_extensions>=4.12
LD_LIBRARY_PATH
libixml.so
mcp_server/gpu_runtime.py、mcp_server/gpu_profile.py 和 mcp_server/device_config.py 共同提供统一运行时事实源:
mcp_server/gpu_runtime.py
mcp_server/gpu_profile.py
mcp_server/device_config.py
auto
cpu
健康结果带缓存和 single-flight 合并,避免 Web /nodes 轮询并发触发多次昂贵的 GPU 初始化。
/nodes
mcp_server/gpu_profile.py 是卡型、显存、AMP 和推荐 batch 的单一策略入口:
device=cuda:0
amp=false
batch=2
workers=0
amp=true
batch=8
ILUVATAR_RECOMMENDED_BATCH
1..64
ILUVATAR_DEFAULT_AMP
训练任务由 Web/API/MCP 进入同一个受控 runner:
参数校验 -> 资产解析 -> 确认令牌 -> 作业入队 -> GPU 租约 -> CoreX CUDA 健康检查 -> Ultralytics YOLO -> 日志/指标/权重归档
适配内容包括:
device=auto
path/train/val/test
image/img/imgs
images
kpt_shape
.pt
yolov8n.pt
yolov8n-pose.pt
yolo11s-pose.pt
cd /data/Iluvatar-gpu-ops-agent source .venv/bin/activate python -V node -v ixsmi python - <<'PY' import torch print("torch_version:", torch.__version__) print("torch_path:", torch.__file__) print("cuda_available:", torch.cuda.is_available()) print("device_count:", torch.cuda.device_count()) if torch.cuda.is_available(): props = torch.cuda.get_device_properties(0) print("device:", torch.cuda.get_device_name(0)) print("memory_mib:", props.total_memory // 1024 // 1024) PY
期望看到 CoreX PyTorch 路径、cuda_available: True、一个或多个设备,以及 Iluvatar MR-V100 或 Iluvatar BI-V150。
cuda_available: True
Iluvatar MR-V100
Iluvatar BI-V150
cd /data git clone https://www.gitlink.org.cn/huowentan/Iluvatar-gpu-ops-agent.git cd Iluvatar-gpu-ops-agent
在线模式只在 install、setup 或 all 阶段安装缺失依赖和尝试获取缺失的可选资产。已有依赖和权重会跳过,start 与 restart 永不安装或下载。
install
setup
all
start
restart
bash ./deploy.sh all
也可以拆分执行:
bash ./deploy.sh install bash ./deploy.sh start bash ./deploy.sh health
脚本要求:
离线模式不会执行 pip/npm/apt 安装、Git 克隆或模型下载。使用前必须已经具备:
web/node_modules
/data/yolo_models/yolov8n.pt
以下两种写法等价:
ILUVATAR_OFFLINE=1 bash ./deploy.sh all bash ./deploy.sh --offline all
离线缺少必需依赖或 detect 权重时会立即失败并列出缺失项;缺少 pose 等可选权重只产生告警。
deploy.sh 是公开部署入口,内部将服务生命周期委托给 start.sh:
bash ./deploy.sh start bash ./deploy.sh status bash ./deploy.sh health bash ./deploy.sh restart bash ./deploy.sh stop
诊断和日志命令:
bash ./start.sh diagnostics bash ./start.sh logs tail -f .logs/api.log .logs/mcp.log .logs/web.log .logs/deploy.log
不要使用旧的 scripts/run.sh 启动生产服务。
scripts/run.sh
http://127.0.0.1:3001/
/api/*
http://127.0.0.1:8007/
http://127.0.0.1:8007/docs
http://127.0.0.1:8007/health
http://127.0.0.1:8007/nodes
http://127.0.0.1:8765/mcp
http://127.0.0.1:8765/health
http://127.0.0.1:3001/nodes 是前端路由,会返回 Vite/React HTML;节点 JSON 应请求 http://127.0.0.1:8007/nodes 或前端代理地址 http://127.0.0.1:3001/api/nodes。
http://127.0.0.1:3001/nodes
http://127.0.0.1:3001/api/nodes
模力方舟实例通常通过 SSH 网关进入。不要把实例密码、访问令牌或真实实例 ID 写入仓库。需要在本机浏览器验收时,使用占位信息建立隧道:
ssh -N \ -L 3001:127.0.0.1:3001 \ -L 8007:127.0.0.1:8007 \ -L 8765:127.0.0.1:8765 \ 'root+<实例ID>@<模力方舟SSH主机>' -p <SSH端口>
只查看 Web 时仅转发 3001 即可;直接调用 API 或 MCP 时再转发 8007、8765。项目端口与 SSH 网关端口是两层不同映射,不要让 Web 占用平台预留的 Jupyter 端口。
默认端口和数据目录可通过环境变量覆盖:
export API_PORT=8007 export WEB_PORT=3001 export MCP_PORT=8765 export DATA_ROOT=/data export MODELS_ROOT=/data/yolo_models export JOBS_ROOT=/data/yolo_jobs
部署脚本首次运行会生成 .env。Web 登录默认值仅用于本机首次启动;对外提供服务前必须修改:
.env
export OPS_AUTH_USERNAME='<管理员用户名>' export OPS_AUTH_PASSWORD='<高强度密码>' export OPS_AUTH_SECRET='<随机长字符串>'
AI 助手是可选能力。未配置 Gitee AI 时,GPU 监控、训练和推理不受影响:
export GITEE_AI_API_KEY='<访问令牌>' export GITEE_AI_MODEL='internlm3-8b-instruct'
令牌和密码只应写入服务器本地 .env 或密钥管理系统,不要提交到 Git。
git status --short git rev-parse HEAD python3 -V node -v ixsmi
确认工作区没有意外修改,设备名和显存与所选实例一致。随后执行“训练前检查”中的 PyTorch 探针,确认 CoreX Torch 路径和 cuda:0。
使用无效代理作为联网门禁,并为每次运行使用独立日志:
set -o pipefail env \ ILUVATAR_OFFLINE=1 \ HTTPS_PROXY=http://127.0.0.1:9 \ HTTP_PROXY=http://127.0.0.1:9 \ ALL_PROXY=http://127.0.0.1:9 \ NO_PROXY=127.0.0.1,localhost \ bash ./deploy.sh all 2>&1 | tee /tmp/iluvatar-offline-all-1.log echo "OFFLINE_ALL_1_EXIT=${PIPESTATUS[0]}"
以 /tmp/iluvatar-offline-all-2.log 为日志文件再执行一次。两次退出码都必须为 0,并检查没有实际联网尝试:
/tmp/iluvatar-offline-all-2.log
grep -nEi \ 'Download failure|Downloading|github\.com|ultralytics\.com/assets|ConnectionPool|curl:|wget:' \ /tmp/iluvatar-offline-all-1.log /tmp/iluvatar-offline-all-2.log \ || echo 'OFFLINE_NO_NETWORK_OK'
需要看到 OFFLINE_NO_NETWORK_OK。不要扫描长期追加的 .logs/deploy.log 判断本轮结果,否则可能命中旧部署留下的下载记录。
OFFLINE_NO_NETWORK_OK
bash ./deploy.sh status bash ./deploy.sh health curl --noproxy '*' -fsS http://127.0.0.1:8007/health curl --noproxy '*' -fsS http://127.0.0.1:8007/nodes curl --noproxy '*' -fsS http://127.0.0.1:8765/health curl --noproxy '*' -I http://127.0.0.1:3001/
期望 API、MCP、Web 全部健康,Web 返回 HTTP 200,/nodes 显示正确的 gpu_family、memory_total_mib、amp_allowed、recommended_batch、training_device=cuda:0 和 inference_device=cuda:0。
gpu_family
memory_total_mib
amp_allowed
recommended_batch
training_device=cuda:0
inference_device=cuda:0
继续验证生命周期:
bash ./deploy.sh restart bash ./deploy.sh health bash ./deploy.sh stop bash ./deploy.sh status bash ./deploy.sh start bash ./deploy.sh health
在 Web 的“训练”页面导入本地数据集 YAML/ZIP,选择本地 detect 权重并运行 1 epoch:
验收要求:
execution_device=cuda:0
weights/best.pt
weights/last.pt
best.pt
coco8.yaml
部署和训练前后分别记录:
sha256sum /data/yolo_models/*.pt .venv/bin/python - <<'PY' import torch print(torch.__version__) print(torch.__file__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'unavailable') PY
已有模型 SHA256 不得因重复部署发生变化,PyTorch 仍应来自 CoreX 系统目录。
source .venv/bin/activate pytest -q cd web npm run build
迁移基线 96b219f 的验收结果为 1240 passed / 0 failed,前端 TypeScript 检查和 Vite 生产构建通过。真实 MR-V100 与 BI-V150 均完成 cuda:0 的 1 epoch YOLO 训练和 best.pt 推理;MR-V100 使用 batch=2, workers=0, amp=false,BI-V150 使用 batch=8, workers=0, amp=true。
96b219f
1240 passed / 0 failed
batch=2, workers=0, amp=false
batch=8, workers=0, amp=true
ixsmi 只证明管理驱动可见。继续检查 torch.__file__、torch.cuda.is_available() 和最小张量计算。如果 torch 来自 .venv/site-packages 或 PyPI,重建采用 --system-site-packages 的虚拟环境,并恢复镜像自带的 CoreX PyTorch;不要安装公版 torch。
torch.__file__
torch.cuda.is_available()
.venv/site-packages
--system-site-packages
coco8.zip
这通常表示数据集或权重只写了逻辑名称,但本地文件不存在。将数据集 YAML、图片、标签和 .pt 权重放入 /data/datasets、/data/yolo_models,使用绝对路径或已注册别名,并开启 ILUVATAR_OFFLINE=1。离线模式缺少必需 detect 权重会明确失败,不会继续尝试联网。
ILUVATAR_OFFLINE=1
检查 8007 和 8765,而不只检查 3001:
curl --noproxy '*' http://127.0.0.1:8007/health curl --noproxy '*' http://127.0.0.1:8007/nodes curl --noproxy '*' http://127.0.0.1:8765/health
如果 status 显示未响应但 health 正常,检查 HTTP_PROXY/HTTPS_PROXY/NO_PROXY 和 localhost 的 IPv4/IPv6 解析,优先使用 127.0.0.1 与 --noproxy '*' 复核。
status
health
HTTP_PROXY/HTTPS_PROXY/NO_PROXY
localhost
127.0.0.1
--noproxy '*'
Vite 6 不支持 Node.js 12。升级到 Node.js 18 或更高版本并重新安装前端依赖,不要在 Node.js 12 环境继续运行 npm run dev。
npm run dev
amp=false, batch=2, workers=0
amp=true, batch=8, workers=0
/data/yolo_jobs/<job_id>/runner.log
numpy<2
docs/双卡部署与验收.md
docs/ARCHITECTURE.md
docs/API_REFERENCE.md
docs/TECHNICAL_REPORT.md
docs/开发记录.md
Apache-2.0
天数算力运维助手 - 基于MCP协议的国产GPU运维智能体
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
天数智芯算力运维助手 - YOLO 训练平台
面向天数智芯(Iluvatar)GPU 的 YOLO 训练、推理与运维监控平台。同一套代码可以在智铠 100(MR-V100)和天垓 150(BI-V150)实例上运行,通过运行时探测选择卡型策略,不为不同型号复制训练 runner、监控器或前端页面。
系统提供 Web UI、FastAPI API 和 MCP Server,可完成 GPU 状态采集、数据集与模型管理、YOLO 训练、图片/视频推理、任务日志和 AI 辅助运维。GPU 指标来自
ixsmi,训练和推理通过天数智芯 CoreX PyTorch 执行。上游仓库
本项目基于 MetaX GPU Ops Agent 迁移和适配。
功能概览
模力方舟运行环境
项目已在模力方舟的天数智芯 GPU 容器实例中完成双卡实测。以下数值来自实际运行环境,不用产品规格页数值代替运行时探测结果。
/dataroot/usr/local/corex-4.4.0/lib64/python3/dist-packages/torch/__init__.pyixsmi,不是nvidia-smi或ix-smi/data/Iluvatar-gpu-ops-agent;已有迁移实例可保留原目录名/data/yolo_models/data/datasets/data/yolo_jobs、/data/yolo_jobs.db/data/ultralytics-src,与模型目录分离.logs/api.log、.logs/mcp.log、.logs/web.log、.logs/deploy.log已验收 GPU 型号
cuda:0falsecuda:0true显存、设备数量和设备名由
ixsmi与torch.cuda实时读取。即使规格文档给出不同显存,也以当前实例实际暴露的数值为准。ixsmi中的CUDA Version表示 IX-ML/CoreX 提供的 CUDA 兼容接口版本,不表示实例安装了 NVIDIA CUDA Toolkit。项目使用 PyTorch 的torch.cuda兼容命名空间访问天数智芯设备,因此torch.cuda.is_available() == True和设备名为 Iluvatar 才能证明计算链路可用;只看到ixsmi的版本字段不能证明 YOLO 可以训练。天数 PyTorch 适配
继承 CoreX PyTorch
天数智芯镜像已经提供与驱动匹配的 CoreX PyTorch。项目虚拟环境必须继承系统包:
deploy.sh和start.sh都按此方式创建.venv。requirements.txt不声明torch、torchvision、torchaudio或triton,安装逻辑还会再次过滤这些包,防止 PyPI 公版覆盖 CoreX 版本。不要执行以下操作:
公版 PyTorch 即使能够导入,也通常不能加载 IX-ML/CoreX 运行库,会造成
torch.cuda.is_available() == False、计算卡死或运行时符号冲突。ABI 与子进程环境
numpy>=1.26,<2:CoreX PyTorch 2.7.1 按 NumPy 1.x ABI 构建,NumPy 2.x 会导致torch.from_numpy等路径失败。opencv-python==4.6.0.66与opencv-python-headless==4.6.0.66:与 CoreX/IGIE 环境保持一致。typing_extensions>=4.12:保证 runner 的最小子进程环境能够导入 Pydantic、FastAPI 和 PyTorch 依赖。LD_LIBRARY_PATH,确保libixml.so和 CoreX 动态库在训练子进程中可见。GPU 探测与设备门禁
mcp_server/gpu_runtime.py、mcp_server/gpu_profile.py和mcp_server/device_config.py共同提供统一运行时事实源:ixsmi获取卡名、IX-ML 版本和真实显存。torch.cuda可用性、设备名、设备数量和总显存。auto才解析为cuda:0。auto、cpu和cuda:0。GPU 请求失败会返回具体错误,不会静默回退 CPU;CPU 只能显式选择。健康结果带缓存和 single-flight 合并,避免 Web
/nodes轮询并发触发多次昂贵的 GPU 初始化。YOLO 训练适配
双卡运行时策略
mcp_server/gpu_profile.py是卡型、显存、AMP 和推荐 batch 的单一策略入口:device=cuda:0、amp=false、batch=2、workers=0。device=cuda:0、amp=true、batch=8、workers=0。ILUVATAR_RECOMMENDED_BATCH可以由运维人员覆盖推荐 batch;用户请求仍需通过1..64参数校验。ILUVATAR_DEFAULT_AMP只影响允许 AMP 的 BI-V150,MR-V100 不接受amp=true。Ultralytics 执行链路
训练任务由 Web/API/MCP 进入同一个受控 runner:
适配内容包括:
device=auto通过统一设备解析器转换为cuda:0,训练和推理使用同一门禁。workers=0,避免容器内多进程 DataLoader 与国产运行时组合出现阻塞。path/train/val/test,并将image/img/imgs目录规范为images。kpt_shape、mask 等字段推断 detect、pose 或 segment,并检查权重任务类型是否匹配。.pt或训练产物。yolov8n.pt是离线 detect 服务的必需权重;yolov8n-pose.pt、yolo11s-pose.pt等可选权重缺失只告警,不阻止 detect 服务启动。训练前检查
期望看到 CoreX PyTorch 路径、
cuda_available: True、一个或多个设备,以及Iluvatar MR-V100或Iluvatar BI-V150。部署
克隆当前仓库
首次在线安装并启动
在线模式只在
install、setup或all阶段安装缺失依赖和尝试获取缺失的可选资产。已有依赖和权重会跳过,start与restart永不安装或下载。也可以拆分执行:
脚本要求:
真正离线部署
离线模式不会执行 pip/npm/apt 安装、Git 克隆或模型下载。使用前必须已经具备:
.venv和全部 Python 依赖;web/node_modules;/data/yolo_models/yolov8n.pt;ixsmi。以下两种写法等价:
离线缺少必需依赖或 detect 权重时会立即失败并列出缺失项;缺少 pose 等可选权重只产生告警。
服务管理
deploy.sh是公开部署入口,内部将服务生命周期委托给start.sh:诊断和日志命令:
不要使用旧的
scripts/run.sh启动生产服务。端口与访问方式
http://127.0.0.1:3001//api/*代理到 8007http://127.0.0.1:8007/http://127.0.0.1:8007/docshttp://127.0.0.1:8007/healthhttp://127.0.0.1:8007/nodeshttp://127.0.0.1:8765/mcphttp://127.0.0.1:8765/healthhttp://127.0.0.1:3001/nodes是前端路由,会返回 Vite/React HTML;节点 JSON 应请求http://127.0.0.1:8007/nodes或前端代理地址http://127.0.0.1:3001/api/nodes。模力方舟实例通常通过 SSH 网关进入。不要把实例密码、访问令牌或真实实例 ID 写入仓库。需要在本机浏览器验收时,使用占位信息建立隧道:
只查看 Web 时仅转发 3001 即可;直接调用 API 或 MCP 时再转发 8007、8765。项目端口与 SSH 网关端口是两层不同映射,不要让 Web 占用平台预留的 Jupyter 端口。
配置
默认端口和数据目录可通过环境变量覆盖:
部署脚本首次运行会生成
.env。Web 登录默认值仅用于本机首次启动;对外提供服务前必须修改:AI 助手是可选能力。未配置 Gitee AI 时,GPU 监控、训练和推理不受影响:
令牌和密码只应写入服务器本地
.env或密钥管理系统,不要提交到 Git。完整验收流程
1. 代码与环境基线
确认工作区没有意外修改,设备名和显存与所选实例一致。随后执行“训练前检查”中的 PyTorch 探针,确认 CoreX Torch 路径和
cuda:0。2. 两次离线幂等部署
使用无效代理作为联网门禁,并为每次运行使用独立日志:
以
/tmp/iluvatar-offline-all-2.log为日志文件再执行一次。两次退出码都必须为 0,并检查没有实际联网尝试:需要看到
OFFLINE_NO_NETWORK_OK。不要扫描长期追加的.logs/deploy.log判断本轮结果,否则可能命中旧部署留下的下载记录。3. 服务和端口
期望 API、MCP、Web 全部健康,Web 返回 HTTP 200,
/nodes显示正确的gpu_family、memory_total_mib、amp_allowed、recommended_batch、training_device=cuda:0和inference_device=cuda:0。继续验证生命周期:
4. YOLO 训练与推理
在 Web 的“训练”页面导入本地数据集 YAML/ZIP,选择本地 detect 权重并运行 1 epoch:
auto或cuda:0auto或cuda:0验收要求:
execution_device=cuda:0,ixsmi能看到训练进程和显存变化。weights/best.pt和weights/last.pt。best.pt,上传本地图片,结果状态为 succeeded,并生成检测结果与标注图。coco8.yaml。5. 权重和 CoreX 完整性
部署和训练前后分别记录:
已有模型 SHA256 不得因重复部署发生变化,PyTorch 仍应来自 CoreX 系统目录。
6. 自动化回归
迁移基线
96b219f的验收结果为1240 passed / 0 failed,前端 TypeScript 检查和 Vite 生产构建通过。真实 MR-V100 与 BI-V150 均完成cuda:0的 1 epoch YOLO 训练和best.pt推理;MR-V100 使用batch=2, workers=0, amp=false,BI-V150 使用batch=8, workers=0, amp=true。常见问题
ixsmi正常,但 PyTorch 不能使用 GPUixsmi只证明管理驱动可见。继续检查torch.__file__、torch.cuda.is_available()和最小张量计算。如果 torch 来自.venv/site-packages或 PyPI,重建采用--system-site-packages的虚拟环境,并恢复镜像自带的 CoreX PyTorch;不要安装公版 torch。YOLO 尝试下载
coco8.zip或权重这通常表示数据集或权重只写了逻辑名称,但本地文件不存在。将数据集 YAML、图片、标签和
.pt权重放入/data/datasets、/data/yolo_models,使用绝对路径或已注册别名,并开启ILUVATAR_OFFLINE=1。离线模式缺少必需 detect 权重会明确失败,不会继续尝试联网。Web 可访问,但节点或训练页面无数据
检查 8007 和 8765,而不只检查 3001:
如果
status显示未响应但health正常,检查HTTP_PROXY/HTTPS_PROXY/NO_PROXY和localhost的 IPv4/IPv6 解析,优先使用127.0.0.1与--noproxy '*'复核。Vite 启动时报 Node.js 语法错误
Vite 6 不支持 Node.js 12。升级到 Node.js 18 或更高版本并重新安装前端依赖,不要在 Node.js 12 环境继续运行
npm run dev。GPU 训练失败或卡住
amp=false, batch=2, workers=0。amp=true, batch=8, workers=0开始,显存不足时再降低 batch。.logs/api.log、.logs/mcp.log和/data/yolo_jobs/<job_id>/runner.log。numpy<2、固定 OpenCV 版本以及 runner 子进程中的LD_LIBRARY_PATH。cpu。技术栈
ixsmi/ IX-ML 4.4.0文档
docs/双卡部署与验收.md:双卡运行时策略和真实 GPU 验收清单docs/ARCHITECTURE.md:系统架构、MCP 工具、训练生命周期和安全设计docs/API_REFERENCE.md:API 端点、错误码和 SSE 接口docs/TECHNICAL_REPORT.md:实现说明和测试结果docs/开发记录.md:功能设计、问题修复和验证记录License
Apache-2.0