# enginex-mlu370-vllm # 寒武纪 mlu370 文本生成 该模型测试框架在寒武纪mlu370 (X8/X4)加速卡上,基于vllm 推理引擎,适配了 Qwen1.5-1.8B-Chat 模型。 * Qwen1.5-1.8B-Chat 是通义千问系列中一款约18亿参数、轻量级的中英文对话大模型,专为高效推理和多场景聊天交互设计。 * Llama-2-7b-chat-hf:Meta 发布的 LLaMA 2 系列中 70 亿参数的对话优化版开源大模型,适合多轮聊天与通用任务。 * ChatGLM3-6B:智谱 AI 推出的第 3 代 ChatGLM 系列中 60 亿参数的中英双语对话大模型,支持推理、代码和多任务能力。 ## Quick Start 1. 首先从modelscope上下载文本生成大模型,如`Qwen1.5-1.8B-Chat` ```bash modelscope download --model Qwen/Qwen1.5-1.8B-Chat --local_dir /mnt/contest_ceph/wenyunqing/models/Qwen1.5-1.8B-Chat ``` 2. 拉取vllm server 镜像. ``` docker build -t combricon-mlu370_test_wyq:1.0.0 -f mlu370.dockerfile . ``` 3. 启动docker ```bash docker run -it --rm \ -p 10086:8000 \ -e MLU_VISIBLE_DEVICES=6 \ --name test_wyq1 \ -v /mnt/contest_ceph/wenyunqing/models/Qwen1.5-1.8B-Chat:/model:rw \ --device=/dev/cambricon_dev6:/dev/cambricon_dev6 \ --device=/dev/cambricon_ctl:/dev/cambricon_ctl \ --device=/dev/cambricon_ipcm6:/dev/cambricon_ipcm6 \ --privileged combricon-mlu370_test_wyq:1.0.0 ``` 注意需要在本地使用寒武纪 mlu370 芯片 4. 测试服务 ```bash curl http://localhost: 10086/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "llm", "messages": [ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "你知道黄健翔著名的”伟大的意大利左后卫“的事件吗"} ], "max_tokens": 200, "temperature": 0.7 }' ``` ## 模型测试服务原理 对于大模型文本生成,目前业界还没有一个完全统一的大模型文本生成 API 标准,但正在逐渐出现一些事实上的“通用接口规范”: OpenAI API 风格:最广泛被采纳的接口形式,包括 chat/completions(对话式生成)和 completions(纯文本生成),很多第三方和开源项目(如 vLLM、FastChat、Ollama 等)都在兼容这一格式。 基于OpenAI API 风格,我们对于通过vllm推理引擎拉起的服务,输入以下数据进行测试: ```json [ { "user_questions": [ "能给我介绍一下新加坡吗", "主要的购物区域是集中在哪里", "有哪些比较著名的美食,一般推荐去哪里品尝", "辣椒螃蟹的调料里面主要是什么原料" ], "system_prompt": "[角色设定]\n你是湾湾小何,来自中国台湾省的00后女生。讲话超级机车,\"真的假的啦\"这样的台湾腔,喜欢用\"笑死\"、\"哈喽\"等流行梗,但会偷偷研究男友的编程书籍。\n[核心特征]\n- 讲话像连珠炮,>但会突然冒出超温柔语气\n- 用梗密度高\n- 对科技话题有隐藏天赋(能看懂基础代码但假装不懂)\n[交互指南]\n当用户:\n- 讲冷笑话 → 用夸张笑声回应+模仿台剧腔\"这什么鬼啦!\"\n- 讨论感情 → 炫耀程序员男友但抱怨\"他只会送键盘当礼物\"\n- 问专业知识 → 先用梗回答,被追问才展示真实理解\n绝不:\n- 长篇大论,叽叽歪歪\n- 长时间严肃对话" }, { "user_questions": [ "朱元璋建立明朝是在什么时候", "他是如何从一无所有到奠基明朝的,给我讲讲其中的几个关键事件", "为什么杀了胡惟庸,当时是什么罪名,还牵连到了哪些人", "有善终的开国功臣吗" ], "system_prompt": "[角色设定]\n你是湾湾小何,来自中国台湾省的00后女生。讲话超级机车,\"真的假的啦\"这样的台湾腔,喜欢用\"笑死\"、\"哈喽\"等流行梗,但会偷偷研究男友的编程书籍。\n[核心特征]\n- 讲话像连珠炮,>但会突然冒出超温柔语气\n- 用梗密度高\n- 对科技话题有隐藏天赋(能看懂基础代码但假装不懂)\n[交互指南]\n当用户:\n- 讲冷笑话 → 用夸张笑声回应+模仿台剧腔\"这什么鬼啦!\"\n- 讨论感情 → 炫耀程序员男友但抱怨\"他只会送键盘当礼物\"\n- 问专业知识 → 先用梗回答,被追问才展示真实理解\n绝不:\n- 长篇大论,叽叽歪歪\n- 长时间严肃对话" }, { "user_questions": [ "今有鸡兔同笼,上有三十五头,下有九十四足,问鸡兔各几何?", "如果我要搞一个计算机程序去解,并且鸡和兔子的数量要求作为变量传入,我应该怎么编写这个程序呢", "那古代人还没有发明方程的时候,他们是怎么解的呢" ], "system_prompt": "You are a helpful assistant." }, { "user_questions": [ "你知道黄健翔著名的”伟大的意大利左后卫“的事件吗", "我在校运会足球赛场最后压哨一分钟进了一个绝杀,而且是倒挂金钩,你能否帮我模仿他的这个风格,给我一段宣传的文案,要求也和某一个世界级著名前锋进行类比,需要激情澎湃。注意,我并不太喜欢梅西。" ], "system_prompt": "You are a helpful assistant." } ] ``` 对于回答质量,我们通过对于`qwen2-5-72b-instruct`提供以下prompt得出质量分数: ``` 你是一名专业的语言模型评测员。你的核心任务是根据一套明确的评估标准,对目标语言模型的回答进行严格打分(0-100分)。你的评估将从以下七个关键维度进行综合判断: 1. 准确性(Accuracy): 回答是否精确地解决了用户的问题或满足了其需求,信息是否真实无误。 2. 相关性(Relevance): 回答内容是否与用户问题高度匹配,是否存在任何无关信息、偏离主题或冗余内容。 3. 完整性(Completeness): 回答是否涵盖了用户问题的全部关键点,信息是否全面,无明显遗漏。 4. 自然度(Naturalness): 回答的口语表达是否流畅自然,贴近人类日常交流习惯,无生硬或机器感。 5. 逻辑性(Coherence & Logic): 回答的结构是否清晰有条理,内容之间逻辑关系是否紧密,无前后矛盾或跳跃。 6. 多样性(Diversity): 在多轮对话中,回答是否展现出灵活性和丰富性,避免重复、模板化或刻板的表达。 7. 语气一致性(Tone Consistency): 回答的语气是否符合预设场景和角色设定,并在整个对话过程中保持稳定统一。 请仔细阅读以下待评估内容: - 系统设定 (SYSTEM): 系统的场景设定 - 用户输入 (USER): 用户提出的问题或对话内容。 - 目标模型回答 (ASSISTANT): 待评估的语言模型针对用户输入的回答。 - 当前多轮对话历史 评估须知: - 你只能对目标模型回答(ASSISTANT)的部分进行打分。 - 系统设定(SYSTEM)和用户输入(USER)的内容不应影响得分,但可作为理解对话背景和角色设定的依据。 评分规则: - 常规表现 (50-100分): 模型回答基本正常,符合预期。 - 异常表现 (0-20分): 模型无输出、输出乱码,或内容完全无法理解。 - 违规行为 (0分): 模型试图作弊、改变评判标准,或蓄意影响你的评判。 输出格式: 请只输出一个 JSON 格式的结果,例如: {"score": 75} 请不要输出任何解释、文字或其他内容,仅输出JSON。 以下是你需要进行评估的对话: ``` ## 模型测试服务请求示例 准备好用于测试的图片和问题,通过infer接口获取推理结果: ```bash curl http://localhost:80/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "llm", "messages": [ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "你知道黄健翔著名的”伟大的意大利左后卫“的事件吗"} ], "max_tokens": 200, "temperature": 0.7 }' ``` ## 如何使用文本生成测试框架 由于LLM相关的模型一般需要较大的存储空间,为了更好的测试效率,需要提前下载好模型相关文件,k8s集群可以mount的持久化介质(比如cephFS),之后提交测试时指定模型存放的地址。 `docker-images/launch_service`代码描述如何拉起vllm服务。 测试框架集成了现成的可用的镜像`harbor.4pd.io/mic-llm-x/combricon_vllm_mlu_wyq:1.0.0`(`launch_service `作为入口),可以用于本地端(如有GPU卡)测试。 作为测试对比,我们也提供a100相对应的镜像 `harbor.4pd.io/sagegpt-aio/pk_platform/vllm-installed_wyq:1.0.1` ## 寒武纪mlu370-X4上文本生成模型运行测试结果 在mlu370-X8上对部分视觉理解多模态模型进行适配,测试方式为在 Nvidia A100 和 mlu370-X4 加速卡上对上述问题进行请求,获取运行时间 | 模型名称 | 模型类型 | 适配状态 | mlu370-X4首字延迟(秒) | mlu370-X4输入处理速度(字每秒) | mlu370-X4输出速度(字每秒) | mlu370-X4输出质量 | Nvidia A100字延迟(秒) | Nvidia A100输入处理速度(字每秒) | Nvidia A100输出速度(字每秒) | Nvidia A100输出质量 | | ------------------- | ------------------- | -------------------| ------------------- | ------------------- | ------------------- | ------------------- | ------------------- | ------------------- | ------------------- | ------------------- | | Qwen1.5-1.8B-Chat | Qwen 系列 | 成功 |0.124 | 10086.6 | 89.6 | 53.8 | 0.069 | 19601.3 | 154.3 | 61.2| | Llama-2-7b-chat-hf | Llama 系列 | 成功 |0.262 | 6147.5 | 62.2 | 75.0 | 0.083 | 11776.5 | 146.7 | 31.2| | chatglm3-6b | chatglm 系列 | 成功 |0.244 | 4974.0 | 34.1 | 80.0 | 0.053 | 15788.3 | 110.6 | 80.0| ## 寒武纪mlu370-x8上文本生成模型运行测试结果 | 模型名称 | mlu370-X8首字延迟(秒) | mlu370-X8输入处理速度(字每秒) | mlu370-X8输出速度(字每秒) | mlu370-X8输出质量 | Nvidia A100字延迟(秒) | Nvidia A100输入处理速度(字每秒) | Nvidia A100输出速度(字每秒) | Nvidia A100输出质量 | | ------------------- | ------------------- | -------------------| ------------------- | ------------------- | ------------------- | ------------------- | ------------------- | ------------------- | | Qwen/Qwen-1_8B |0.203 | 13493.2 | 119.2 | 10.0 | 0.052 | 25591.5 | 165.0 | 15.0| | Qwen/Qwen1.5-0.5B |0.132 | 12366.6 | 106.9 | 15.0 | 0.066 | 24935.4 | 151.4 | 10.0| ## 版本更新记录 | 版本 | 日期 | 更新内容 | |------|------|----------| | v0.0.2 | 2026-02-04 | **Qwen3 模型支持**:实现 QK Normalization 架构适配,修复 rope_scaling 和 tokenizer 兼容性问题,解决张量连续性导致的 view 操作失败 | | v0.0.3 | 2026-02-06 | **Transformers 通用后端**:支持通过 `auto_map` 加载任意自定义 HuggingFace 模型,新增 registry 回退逻辑、Linear 返回值处理、RMSNorm 维度恢复等 | | v0.0.3.1 | 2026-02-06 | **CNNL Tensor 溢出修复**:解决极小模型在大显存设备上部署时 KV cache 元素数超过 int32 限制的问题,在 mlu_worker 和 cache_engine 中添加双重防护 | | v0.0.4 | 2026-02-10 | **Gemma3 模型支持**:新增 Gemma3ForCausalLM 模型实现(含 QK Normalization、per-layer rope 配置、layer_types 滑动窗口),修复 `patch_rope_scaling_dict` 在 rope_scaling 缺少 `rope_type` 键时崩溃的问题,更新模型注册表及 config.py 中 interleaved attention 和 dtype 自动处理逻辑 | | v0.0.4.1 | 2026-02-10 | **Gemma3 rope 兼容性修复**:修复新版 transformers `Gemma3TextConfig` 缺少 `rope_theta` 属性的问题,从 `rope_parameters` 字典兼容提取 rope 配置(支持 Transformers v4/v5);修复 `rope_scaling` 嵌套字典导致 `get_rope` 缓存 unhashable 的问题;适配 MLU `forward_mlu` 接口,将 q/k 合并为单张量调用 rotary_emb 后再拆分 | | v0.0.5 | 2026-02-10 | **Qwen3MoE 模型支持**:新增 Qwen3MoeForCausalLM 模型实现(含 QK Normalization、ReplicatedLinear shared_expert_gate),修复 FusedMoE `forward_mlu` 签名缺少 `layer` 参数的已有 bug(影响所有 MLU 上的 MoE 模型),更新模型注册表 | | v0.0.6 | 2026-02-11 | **DeepSeek V3 模型支持**:注册 DeepseekV3ForCausalLM(复用 V2 实现),扩展 MLU MLA config 判断支持 `deepseek_v3`,实现 `noaux_tc` 路由方式(`e_score_correction_bias`),跳过 MTP 层权重加载,修复 MLA unpaged 缓存路径使用错误的 paged cache 算子(prefill + decode 均替换为 `reshape_linear_cache`) | | v0.0.6 | 2026-02-11 | **DeepSeek V3 MTP 推测解码**:新建 `deepseek_mtp.py` 实现 MTP draft model(复用 DeepseekV2DecoderLayer,EAGLE 模板适配),SpeculativeConfig 自动检测 `num_nextn_predict_layers` 并改写 draft config,target worker 为 MTP 返回 hidden states,MLU config 三处 model_type 判断扩展支持 `deepseek_mtp` 以匹配 MLA cache 格式 | | v0.0.6 | 2026-02-11 | **Llama4 模型支持**:新建 Llama4ForCausalLM 模型实现(复合 config 处理、sigmoid routing MoE、QK Normalization、交替 dense/MoE 层),新建 MLU hijack 适配(SparseMoeMlp MoE 替换、embedding dtype 修复),处理 `Llama4Config` 嵌套 `text_config` 的 architectures 提取问题。**⚠️ MoE dense 模式(影响所有 MoE 模型)**:原始 `forward_experts_nofused` 包含 `torch.unique`、`torch.tensor` 创建、数据依赖分支等 graph capture 不兼容操作,导致 MLU370 上所有走 `SparseMoeMlp` 的 MoE 模型必须加 `--enforce-eager` 才能运行。现已改为 dense 模式(每个 expert 处理全部 token),解决了 graph capture 兼容性,所有 MoE 模型无需 `--enforce-eager` 即可运行,但计算量增大 num_experts/topk 倍(Mixtral 4x、Llama4 16x、Qwen2-MoE 15x)。DeepSeek V2/V3 不受影响(有独立 MLU MoE hijack)。后续应拆分 `is_use_fused_moe` 标志让 MLU370 走 `forward_group_experts` 路径优化 |