ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Qwen 项目 recipes 单元测试指南:pytest 运行方式、测试矩阵与 Docker 验证实践

Qwen 项目 recipes 单元测试指南:pytest 运行方式、测试矩阵与 Docker 验证实践 人工智能大模型微调LoRA模型量化本地部署模型推理服务【免费下载链接】QwenThe official repo of Qwen (通义千问) chat pretrained large language model proposed by Alibaba Cloud.项目地址https://gitcode.com/GitHub_Trending/qw/Qwen点击查看免费下载导读本文以 recipes/tests/README.md 为骨架系统讲解 Qwen 开源仓库中 recipes 层单元测试的三种标准运行方式全量、按目录、重跑失败用例并深入测试源码剖析微调DeepSpeed ZeRO 矩阵与推理OpenAI API、vLLM FastChat两大测试模块的实现细节、公共基础设施与已知边界条件。读完本文你将掌握这套基于 pytest Docker 的测试体系的完整脉络能够独立运行、定位并扩展 Qwen 的回归测试。一、测试体系概览recipes/tests 的目录设计与定位Qwen 仓库的recipes/目录承载了面向应用场景的配方式指南而recipes/tests/则是支撑这些配方的回归测试集。其目录结构如下recipes/tests/init.py空文件标记测试包。recipes/tests/ut_config.py公共配置模型标识、Docker 镜像版本、容器挂载路径等。recipes/tests/utils.py通用工具函数子进程命令执行、OpenAI API 探活、端口检测。recipes/tests/assets/test_sampled_qwen.json微调测试所用的最小样本数据集。recipes/tests/test_finetune/test_finetune_ds.py微调链路测试全参数 / LoRA / QLoRA覆盖 DeepSpeed ZeRO-2/3。recipes/tests/test_inference/test_inference_api.py基于openai_api.py的推理服务测试。recipes/tests/test_inference/test_inference_vllm_fschat.py基于 vLLM FastChat 的推理服务测试。从测试源码看这套测试的设计意图是「在 Docker 容器内端到端验证真实链路」微调测试在容器中通过torchrun拉起finetune.py训练 1 个 epoch推理测试则在容器中启动模型服务并通过 OpenAI 兼容接口真实发请求验证。因此运行测试的前提是准备好 GPU 环境与对应版本的 Qwen 官方 Docker 镜像见下文公共配置。二、快速上手三种标准 pytest 运行方式原文档给出了三种运行方式均在recipes/tests目录下执行即先cd recipes/tests1. 运行全部单元测试cd tests pytest -s-s关闭 pytest 的输出捕获即--captureno让print语句直接打印到终端。这在上述测试中非常必要——测试源码里大量使用print例如 test_inference_api.py 打印待执行的 Docker 命令、simple_openai_api打印模型回复、等待服务启动时打印进度-s能让你实时观察容器启动、模型下载与服务探活的完整过程。2. 运行指定子目录下的测试cd tests pytest -s {dir}{dir}是recipes/tests下的子目录例如cd tests pytest -s test_finetune # 只跑微调测试 cd tests pytest -s test_inference # 只跑推理测试pytest 会自动发现test_*.py文件并收集其中的test_*函数。这一模式适合按功能模块定向回归例如只改了finetune.py时无需跑完整的推理测试。3. 重跑上次失败的用例cd tests pytest -s --lf--lf--last-failed是 pytest 内置的缓存机制每次运行后pytest 会把结果缓存在.pytest_cache中--lf只重新执行上次失败的用例适合在修复问题或环境就绪后快速验证。可结合--lf与{dir}进一步缩小重跑范围。需要说明的是原文档中的cd tests隐含「当前目录为recipes/」这一前提测试文件通过sys.path.append(os.path.dirname(__file__) /..)向上导入同层的utils.py与ut_config.py也印证了测试必须以其自身目录为工作根。若从仓库根目录执行等效命令为cd recipes/tests pytest -s三、公共基础设施ut_config.py 与 utils.py3.1 公共配置 ut_config.py所有测试共享一套集中配置MODEL_TYPE Qwen/Qwen-1_8B测试使用的默认模型覆盖 Chat对话微调与 base预训练底座两种形态QLoRA 场景额外使用-Int4量化版由测试代码动态拼接见 test_finetune_ds.py。三个 Docker 镜像版本qwenllm/qwen:cu114、cu117、cu121对应不同 CUDA 版本测试矩阵会逐个遍历。DOCKER_MOUNT_DIR /qwen-recipes仓库挂载进容器后的根路径。DOCKER_TEST_DIR、DATA_DIR、DS_CONFIG_ZERO2_DIR、DS_CONFIG_ZERO3_DIR分别指向容器内测试目录、样本数据与两份 DeepSpeed 配置。从配置可以看出测试采用「目录挂载」而非「镜像内置代码」的方式宿主机上的 Qwen 仓库通过-v {仓库路径}:/qwen-recipes挂载进容器因此代码改动无需重新构建镜像即可被测试覆盖。3.2 通用工具 utils.py三个函数支撑了整个测试体系的执行与验证run_in_subprocess(cmd)以shellTrue启动子进程实时读取 stdout/stderr 并写入日志若返回码非零则抛出包含错误输出的RuntimeError保证测试失败时能拿到完整诊断信息。这是所有 Docker 命令的统一执行入口。simple_openai_api(model)通过openai库openai.api_base http://localhost:8000/v1、api_keynone向本地模型服务发起一次非流式ChatCompletion.create请求消息内容为「你好」并打印模型回复用于验证推理服务端到端可用。代码注释提示可在此添加自定义停止词例如 ReAct 提示词所需的stop[Observation:]。TelnetPort(server_ip, port)用带 1 秒超时的 TCP socket 探测指定端口是否可连接作为「模型服务是否就绪」的探活手段供测试在启动容器后轮询等待。四、微调测试深入test_finetune_ds.py 的测试矩阵test_finetune_ds.py 是微调链路的回归测试其核心是借助pytest.mark.parametrize构造的笛卡尔积测试矩阵。4.1 测试矩阵的构成矩阵由五个维度组合而成源码 第 23-44 行GPU 数量1 或 2torchrun --nproc_per_node。训练方式full全参数、lora、qlora。模型形态chat/base分别对应Qwen/Qwen-1_8B-Chat与Qwen/Qwen-1_8B。Docker 版本cu114 / cu117 / cu121。DeepSpeed 配置None、ZeRO-2、ZeRO-3。源码注释明确记录了兼容性边界ZeRO-3 与 base 模型上的 LoRA 不兼容FSDP 或 ZeRO-3 与 QLoRA 不兼容。因此 ZeRO-3 分支只对full全量开放lora仅允许chat形态QLoRA 分支则只在 1/2 卡下组合 None 或 ZeRO-2 配置。这份矩阵本身就是「什么组合可以跑」的可执行文档。4.2 测试执行的关键细节每个用例执行以下步骤源码 第 50-99 行构造容器命令docker run --gpus all --ipchost --networkhost --rm -v {仓库}:{DOCKER_MOUNT_DIR} {镜像} /bin/bash -c ...。--networkhost保证容器内torchrun的多卡通信与宿主机网络一致。兼容性预处理通过torch.cuda.get_device_capability()检测 GPU 算力若 SM 80即不支持 Ampere 之后架构特性先pip uninstall -y flash-attn若lora ZeRO-2 base 组合追加--fp16 True。运行微调容器内执行torchrun拉起 finetune.py关键训练参数包括--num_train_epochs 1、--per_device_train_batch_size 1、--gradient_accumulation_steps 2、--learning_rate 1e-5、--weight_decay 0.1、--adam_beta2 0.95、--warmup_ratio 0.01、--lr_scheduler_type cosine、--model_max_length 512、--save_strategy steps、--save_steps 1000、--save_total_limit 10并根据train_type追加--use_lora/--q_lora、按需追加--deepspeed {配置路径}。下载模型snapshot_download(model_type, cache_dir., revisionmaster)从 ModelScope 拉取对应模型QLoRA 场景为-Int4版。验证产物全参数训练断言output_qwen/config.json存在LoRA/QLoRA 断言output_qwen/adapter_config.json存在随后shutil.rmtree清理输出保证用例可重复执行。这从源码层面印证了 finetune.py 中use_lora、q_lora、model_max_length等参数的真实语义也与 finetune/deepspeed/ 下的配方文档形成闭环。五、推理测试深入OpenAI API 与 vLLM FastChat 两条链路推理测试的目标是「在容器内把模型服务真正跑起来并发出真实请求验证返回」。5.1 基于 openai_api.py 的服务测试test_inference_api.py 按docker_version × use_int4参数化共 6 组每组执行启动容器docker run --gpus all --ipchost --networkhost --rm --nametest_inference_api -p 8000:8000 -v {仓库}:{DOCKER_MOUNT_DIR} {镜像} /bin/bash -c python {DOCKER_MOUNT_DIR}/openai_api.py -c {模型路径}其中模型为Qwen-1_8B-Chat或-Int4版本SM 80 时同样先卸载 flash-attn。后台启动nohup ... 并将日志重定向到tmp.log。用TelnetPort(localhost, 8000)轮询等待服务就绪期间若容器已退出docker inspect失败则提前终止。调用 utils.py 中的simple_openai_api发起真实对话请求注意 Int4 场景下模型名按Qwen-1_8B-Chat传入异常时读取tmp.log辅助定位。用例结束强制docker rm -f清理容器。源码注释记录了两条重要的已知边界CPU-only 模式会因 Half 精度算子addmm_impl_cpu_未实现而报错Int4 量化使用 Exllama/ExllamaV2 后端时要求全部模块位于 GPU否则需要disable_exllamaTrue。这解释了为何该测试的use_cpu参数全部为False——当前测试矩阵仅覆盖 GPU 推理路径。5.2 基于 vLLM FastChat 的服务测试test_inference_vllm_fschat.py 按num_gpus × use_int4参数化1 卡/2 卡 × 普通/Int4其中 2 卡 Int4 因量化权重与张量并行尺寸不匹配的已知问题被注释禁用执行 FastChat 三进程标准架构python -m fastchat.serve.controller控制面探活端口为 21002python -m fastchat.serve.openai_api_server --host localhost --port 8000OpenAI 兼容网关python -m fastchat.serve.vllm_worker --model-path {模型} --tensor-parallel-size {num_gpus} --trust-remote-codevLLM worker--tensor-parallel-size决定跨卡并行度。当 SM 80 或使用 Int4 时追加--dtype half对应源码 第 40-42 行 的兼容分支。探活与验证流程与 API 测试一致先等 21002 端口就绪再通过simple_openai_api完成一次真实对话最后清理容器。vLLM 推理路径与 recipes/inference/vllm/ 下的部署配方可互相印证。六、测试数据与 DeepSpeed 配置6.1 样本数据 test_sampled_qwen.json该文件是微调测试的训练数据采用 Qwen 多轮对话格式——每条约含id与conversationsuser/assistant交替例如{conversations: [{from: user, value: 你好}, {from: assistant, value: 你好很高兴为你提供帮助。}], id: identity_0}。这与 finetune.py 中SupervisedDataset/LazySupervisedDataset对raw_data[conversations]的解析逻辑见 finetune.py完全对应数据被preprocess加工为|im_start|user/assistant的 ChatML 模板用户侧 token 以IGNORE_TOKEN_ID屏蔽、助手侧参与损失计算。6.2 DeepSpeed 配置两份配置即 finetune/ds_config_zero2.json 与 finetune/ds_config_zero3.json也是微调配方文档 recipes/finetune/deepspeed/ 的依赖项ZeRO-2zero_optimization.stage 2开启overlap_comm、contiguous_gradients、reduce_scatterallgather_bucket_size与reduce_bucket_size均为 2e8优化器为 AdamW调度器为 WarmupLR学习率、权重衰减、梯度累积步数等均以auto交给训练脚本统一管理。ZeRO-3zero_optimization.stage 3在 ZeRO-2 基础上增加offload_paramdevice: none、stage3_gather_16bit_weights_on_model_save: true保存时聚合 16bit 权重并配置sub_group_size、stage3_max_live_parameters等分片参数。测试中正是通过--deepspeed参数把这两份配置注入 finetune.py 的验证了「配置即测试输入」的设计。七、运行测试的注意事项与调试建议综合上述源码细节运行这套测试需要注意环境前提需要 NVIDIA GPU 与 Docker测试命令含--gpus all并预先准备好qwenllm/qwen:cu114/cu117/cu121镜像测试会从 ModelScope 下载Qwen/Qwen-1_8B系列模型需要网络可达。目录前提在recipes/tests目录下执行 pytest子目录运行、失败重跑均保持同样的工作目录。算力兼容SM 80 的 GPU 上测试会自动卸载 flash-attn 并追加--fp16 True推理测试在 SM 80 或 Int4 场景追加--dtype half。已知禁用组合ZeRO-3 base 上的 LoRA、ZeRO-3/FSDP QLoRA、2 卡 Int4 的 vLLM 张量并行均在源码中以注释形式记录了不兼容原因。失败排查推理测试把容器日志写入tmp.log服务未就绪或请求异常时会读出日志内容拼入异常信息微调测试的错误信息同样由run_in_subprocess汇总抛出定位问题应先看这些输出再用pytest -s --lf重跑失败用例。只读仓库提示本仓库为只读运行测试不会修改仓库文件微调测试的output_qwen产物会在用例内自动清理。八、总结Qwen 的 recipes 单元测试体系以 recipes/tests/README.md 的三种 pytest 命令为入口背后是一套「Docker 容器 真实链路 参数化矩阵」的回归方案公共配置集中在 ut_config.py通用执行与验证逻辑沉淀在 utils.py微调与推理两大模块分别由 test_finetune_ds.py 和 test_inference 目录承载。理解这套体系既能快速跑通 Qwen 的回归测试也能为扩展新的微调/推理场景测试提供可直接复用的范式。赞分享人工智能大模型微调LoRA模型量化本地部署模型推理服务【免费下载链接】QwenThe official repo of Qwen (通义千问) chat pretrained large language model proposed by Alibaba Cloud.项目地址https://gitcode.com/GitHub_Trending/qw/Qwen点击查看免费下载相关推荐RepRapFirmware S曲线运动规划实现平滑加减速的高级算法RepRapFirmware S曲线运动规划实现平滑加减速的高级算法 RepRapFirmware是一款开源的3D打印机固件其核心功能之一是S曲线运动规划算嵌入式固件智能硬件物联网NetAlertX API 单元测试实战指南在 Docker 容器中运行 pytest 测试套件NetAlertX API 单元测试实战指南在 Docker 容器中运行 pytest 测试套件 导读 本文是 NetAlertX 官方文档 docs/API后端网络运维数据可视化ParlAI 测试实战指南从 pytest 运行到 TorchGeneratorAgent 单元测试编写ParlAI 测试实战指南从 pytest 运行到 TorchGeneratorAgent 单元测试编写 ParlAI 是面向开放对话数据集训练与评估 AINLP人工智能深度学习上一篇Playnite 启动参数速查3 步砍掉开机等待下一篇如何使用 lint-staged 优化 NestJS GraphQL API 开发流程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表