华为云用户手册

  • Step3 启动kv-cache-int8量化服务 参考Step3 启动推理服务,启动推理服务时添加如下命令。 --kv-cache-dtype int8 #只支持int8,表示kvint8量化 --quantization-param-path kv_cache_scales.json #输入Step2 抽取kv-cache量化系数生成的json文件路径; 如果只测试推理功能和性能,不需要此json文件,此时scale系数默认为1,但是可能会造成精度下降。
  • Step1使用tensorRT量化工具进行模型量化 在GPU机器上使用tensorRT 0.9.0版本工具进行模型量化,工具下载使用指导请参见https://github.com/NVIDIA/TensorRT-LLM/tree/v0.9.0。 执行如下脚本进行权重转换生成量化系数,详细参数解释请参见https://github.com/NVIDIA/TensorRT-LLM/tree/v0.9.0/examples/llama#int8-kv-cache python convert_checkpoint.py \ --model_dir ./llama-models/llama-7b-hf \ --output_dir ./llama-models/llama-7b-hf/int8_kv_cache/ \ --dtype float16 \ --int8_kv_cache 运行完成后,会在output_dir下生成量化后的权重。量化后的权重包括原始权重和kvcache的scale系数。
  • 步骤三:在RAGFlow中新增模型供应商 在RAGFlow平台右上角,单击用户头像,选择“模型提供商”,在“OpenAI-API-Compatible”卡片中单击“添加模型”。 图1 新增模型供应商 在“添加 LLM”对话框,配置相关信息,然后单击“确定”。 表2 添加LLM参数说明 参数 说明 模型类型 选择“chat”。 模型名称 步骤二.2获取的模型名称。 基础 Url 步骤二.2获取的基础API地址,需要去掉地址尾部的“/chat/completions”后填入。 API-Key 步骤二.1创建的API Key。 最大token数 基于模型支持的上下文长度填写,各预置服务支持的最大Token数请参见表2 预置服务支持的最大Token数。 表3 预置服务支持的最大Token数 预置服务名称 上下文长度 最大Token数 DeepSeek-R1-671B-32K(推荐) 32k 32768 DeepSeek-V3-671B-32K(推荐) 32k 32768 DeepSeek-R1-671B-8K 8k 8192 DeepSeek-V3-671B-8K 8k 8192 DeepSeek-V3-671B-4K 4k 4096 DeepSeek-R1-671B-4K 4k 4096 修改系统模型设置。 在“模型供应商”页面右上角,单击“系统模型设置”,将“聊天模型”设置为已配置的MaaS模型。嵌入和Rerank模型可使用系统预置。 图2 修改系统模型设置
  • 背景介绍 RAGFlow是一款基于深度文档理解构建的开源RAG引擎,专为处理复杂数据结构与生成高质量问答而设计。该引擎结合了先进的检索技术和大型语言模型(LLM),支持多种数据格式(例如PDF、Word、Excel、图片等)的深度解析和知识提取。通过多路召回、融合重排序和可视化文本切片等功能,RAGFlow提供了精准、可解释且高效的信息处理能力,适用于从个人知识库到企业级智能客服的多元化应用场景。 ModelArts Studio(简称MaaS)服务将DeepSeek系列模型部署到平台,基于华为云昇腾云服务的全栈优化适配,可获得持平全球高端GPU部署模型的效果,提供稳定的生产级服务能力,满足业务商用部署需求,支持广大开发者在线体验或端外调用。同时,MaaS提供免费Token支持开发者免费使用,帮助开发者快速验证和实现创新应用。更多信息,请参见 免费体验 MaaS预置服务。
  • 使用限制 贵阳一区域:最新的版本因为支持新驱动,目前仅支持使用专属资源池(Snt9b2)。 乌兰一区域:支持使用公共资源池(Snt9b3)。 如果支持公共资源池,但是没开白名单,“资源池类型”选择“公共资源池”时,下方会出现提示:公共资源池暂未完全公开,如需申请使用,请联系与您对接的销售人员或拨打4000-955-988获得支持,您也可以在线提交售前咨询。 如果不支持公共资源池,“公共资源池”按钮会置灰,鼠标悬停时,会提示:该模型版本暂不支持公共资源池部署;如果专属资源池不匹配,勾选按钮会置灰,鼠标悬停时,会出现相关提示,请按照提示进行相关操作。
  • Step1使用tensorRT量化工具进行模型量化 使用tensorRT 0.9.0版本工具进行模型量化,工具下载使用指导请参见https://github.com/NVIDIA/TensorRT-LLM/tree/v0.9.0。 执行如下脚本进行权重转换生成量化系数,详细参数解释请参见https://github.com/NVIDIA/TensorRT-LLM/tree/v0.9.0/examples/llama#int8-kv-cache python convert_checkpoint.py \ --model_dir ./llama-models/llama-7b-hf \ --output_dir ./llama-models/llama-7b-hf/int8_kv_cache/ \ --dtype float16 \ --int8_kv_cache 运行完成后,会在output_dir下生成量化后的权重。量化后的权重包括原始权重和kvcache的scale系数。
  • Step3 启动kv-cache-int8量化服务 参考Step3 启动推理服务,启动推理服务时添加如下命令。 --kv-cache-dtype int8 #只支持int8,表示kvint8量化 --quantization-param-path kv_cache_scales.json #输入Step2 抽取kv-cache量化系数生成的json文件路径; 如果只测试推理功能和性能,不需要此json文件,此时scale系数默认为1,但是可能会造成精度下降。
  • 问题3:训练过程报错:ImportError: XXX not found in your environment: flash_attn 根因:昇腾环境暂时不支持flash_attn接口 规避措施:修改dynamic_module_utils.py文件,将180-184行代码注释掉 vim /home/ma-user/anaconda3/envs/PyTorch-2.1.0/lib/python3.9/site-packages/transformers/dynamic_module_utils.py
  • 问题5:训练完成使用vllm0.6.0框架推理失败: 错误截图: 报错原因: 训练时transformers版本要求为4.45.0,训练完成后保存的tokenizer.json文件中的“merges”时保存的是拆开的列表不是字符串,导致推理异常 解决措施,以下两种方法任选其一: 更新transformes和tokenizers版本 GLM4-9B模型,容器内执行以下步骤: pip install transformers==4.43.2 其它模型,容器内执行以下步骤: pip install transformers==4.45.0 pip install tokenizers==0.20.0 使用原始hf权重的tokenizer.json覆盖保存的tokenizer.json即可,如llama3-8b_lora具体过程如下: # 进入模型tokenizer目录 cd /home/ma-user/ws/tokenizers/llama3-8b/ # 替换tokenizer.json文件 cp -f tokenizer.json /home/ma-user/ws/saves/rm/llama3-8b/lora/tokenizer.json
  • 问题1:在训练过程中遇到NPU out of memory 解决方法: 容器内执行以下命令,指定NPU内存分配策略的环境变量,开启动态内存分配,即在需要时动态分配内存,可以提高内存利用率,减少OOM错误的发生。 export PYTORCH_NPU_ALLOC_CONF="expandable_segments:True"; 将yaml文件中的per_device_train_batch_size调小,重新训练如未解决则执行下一步。 替换深度学习训练加速的工具或增加zero等级,可参考模型NPU卡数、梯度累积值取值表,如原使用Accelerator可替换为Deepspeed-ZeRO-1,Deepspeed-ZeRO-1替换为Deepspeed-ZeRO-2以此类推,重新训练如未解决则执行下一步。 - ZeRO-0 数据分布到不同的NPU - ZeRO-1 Optimizer States分布到不同的NPU - ZeRO-2 Optimizer States、Gradient分布到不同的NPU - ZeRO-3 Optimizer States、Gradient、Model Parameter分布到不同的NPU 增加卡数重新训练,未解决找相关人员定位。
  • 问题4:Error waiting on exit barrier错误 错误截图: 报错原因:多线程退出各个节点间超时时间默认为300s,时间设置过短。 解决措施: 修改容器内torch/distributed/elastic/agent/server/api.py文件参数: vim /home/ma-user/anaconda3/envs/PyTorch-2.2.0/lib/python3.10/site-packages/torch/distributed/elastic/agent/server/api.py 修改def _exit_barrier(self)方法中的barrier_timeout参数,修改后如图1所示。 #修改前 barrier_timeout=self._exit_barrier_timeout #修改后 barrier_timeout=3000 图1 修改后的barrier_timeout参数
  • per-tensor静态量化场景 在GPU机器上使用tensorRT 0.9.0版本工具进行模型量化,工具下载使用指导请参见https://github.com/NVIDIA/TensorRT-LLM/tree/v0.9.0。 量化脚本convert_checkpoint.py存放在TensorRT-LLM/examples路径对应的模型文件夹下,例如:llama模型对应量化脚本的路径是examples/llama/convert_checkpoint.py。 执行convert_checkpoint.py脚本进行权重转换生成量化系数。
  • 支持的模型列表 表1 支持的大语言模型列表和权重获取地址 序号 模型名称 是否支持fp16/bf16推理 是否支持W4A16量化 是否支持W8A8量化 是否支持W8A16量化 是否支持 kv-cache-int8量化 开源权重获取地址 1 llama-7b √ √ √ √ √ https://huggingface.co/huggyllama/llama-7b 2 llama-13b √ √ √ √ √ https://huggingface.co/huggyllama/llama-13b 3 llama-65b √ √ √ √ √ https://huggingface.co/huggyllama/llama-65b 4 llama2-7b √ √ √ √ √ https://huggingface.co/meta-llama/Llama-2-7b-chat-hf 5 llama2-13b √ √ √ √ √ https://huggingface.co/meta-llama/Llama-2-13b-chat-hf 6 llama2-70b √ √ √ √ √ https://huggingface.co/meta-llama/Llama-2-70b-hf https://huggingface.co/meta-llama/Llama-2-70b-chat-hf (推荐) 7 llama3-8b √ √ √ √ √ https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct 8 llama3-70b √ √ √ √ √ https://huggingface.co/meta-llama/Meta-Llama-3-70B-Instruct 9 yi-6b √ √ √ √ √ https://huggingface.co/01-ai/Yi-6B-Chat 10 yi-9b √ √ √ √ √ https://huggingface.co/01-ai/Yi-9B 11 yi-34b √ √ √ √ √ https://huggingface.co/01-ai/Yi-34B-Chat 12 deepseek-llm-7b √ x x x x https://huggingface.co/deepseek-ai/deepseek-llm-7b-chat 13 deepseek-coder-33b-instruct √ x x x x https://huggingface.co/deepseek-ai/deepseek-coder-33b-instruct 14 deepseek-llm-67b √ x x x x https://huggingface.co/deepseek-ai/deepseek-llm-67b-chat 15 qwen-7b √ √ √ √ x https://huggingface.co/Qwen/Qwen-7B-Chat 16 qwen-14b √ √ √ √ x https://huggingface.co/Qwen/Qwen-14B-Chat 17 qwen-72b √ √ √ √ x https://huggingface.co/Qwen/Qwen-72B-Chat 18 qwen1.5-0.5b √ √ √ √ x https://huggingface.co/Qwen/Qwen1.5-0.5B-Chat 19 qwen1.5-7b √ √ √ √ x https://huggingface.co/Qwen/Qwen1.5-7B-Chat 20 qwen1.5-1.8b √ √ √ √ x https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat 21 qwen1.5-14b √ √ √ √ x https://huggingface.co/Qwen/Qwen1.5-14B-Chat 22 qwen1.5-32b √ √ √ √ x https://huggingface.co/Qwen/Qwen1.5-32B/tree/main 23 qwen1.5-72b √ √ √ √ x https://huggingface.co/Qwen/Qwen1.5-72B-Chat 24 qwen1.5-110b √ √ √ √ x https://huggingface.co/Qwen/Qwen1.5-110B-Chat 25 qwen2-0.5b √ √ √ √ x https://huggingface.co/Qwen/Qwen2-0.5B-Instruct 26 qwen2-1.5b √ √ √ √ x https://huggingface.co/Qwen/Qwen2-1.5B-Instruct 27 qwen2-7b √ √ x √ x https://huggingface.co/Qwen/Qwen2-7B-Instruct 28 qwen2-72b √ √ √ √ x https://huggingface.co/Qwen/Qwen2-72B-Instruct 29 qwen2.5-0.5b √ √ √ √ x https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct 30 qwen2.5-1.5b √ √ √ √ x https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct 31 qwen2.5-3b √ √ √ √ x https://huggingface.co/Qwen/Qwen2.5-3B-Instruct 32 qwen2.5-7b √ √ x √ x https://huggingface.co/Qwen/Qwen2.5-7B-Instruct 33 qwen2.5-14b √ √ √ √ x https://huggingface.co/Qwen/Qwen2.5-14B-Instruct 34 qwen2.5-32b √ √ √ √ x https://huggingface.co/Qwen/Qwen2.5-32B-Instruct 35 qwen2.5-72b √ √ √ √ x https://huggingface.co/Qwen/Qwen2.5-72B-Instruct 36 baichuan2-7b √ x x √ x https://huggingface.co/baichuan-inc/Baichuan2-7B-Chat 37 baichuan2-13b √ x x √ x https://huggingface.co/baichuan-inc/Baichuan2-13B-Chat 38 gemma-2b √ x x x x https://huggingface.co/google/gemma-2b 39 gemma-7b √ x x x x https://huggingface.co/google/gemma-7b 40 chatglm2-6b √ x x x x https://huggingface.co/THUDM/chatglm2-6b 41 chatglm3-6b √ x x x x https://huggingface.co/THUDM/chatglm3-6b 42 glm-4-9b √ x x x x https://huggingface.co/THUDM/glm-4-9b-chat 43 mistral-7b √ x x x x https://huggingface.co/mistralai/Mistral-7B-v0.1 44 mixtral-8x7b √ x x x x https://huggingface.co/mistralai/Mixtral-8x7B-Instruct-v0.1 45 falcon-11b √ x x x x https://huggingface.co/tiiuae/falcon-11B/tree/main 46 qwen2-57b-a14b √ x x x x https://huggingface.co/Qwen/Qwen2-57B-A14B-Instruct 47 llama3.1-8b √ √ √ √ x https://huggingface.co/meta-llama/Meta-Llama-3.1-8B-Instruct 48 llama3.1-70b √ √ √ √ x https://huggingface.co/meta-llama/Meta-Llama-3.1-70B-Instruct 49 llama-3.1-405B √ √ x x x https://huggingface.co/hugging-quants/Meta-Llama-3.1-405B-Instruct-AWQ-INT4 50 llama-3.2-1B √ x x x x Llama-3.2-1B-Instruct · 模型库 (modelscope.cn) 51 llama-3.2-3B √ x x x x Llama-3.2-3B-Instruct · 模型库 (modelscope.cn) 52 deepseek-v2-236b x x √ x x https://huggingface.co/deepseek-ai/DeepSeek-V2 53 deepseek-v2-lite-16b √ x √ x x https://huggingface.co/deepseek-ai/DeepSeek-V2-Lite 54 qwen-vl √ x x x x https://huggingface.co/Qwen/Qwen-VL 55 qwen-vl-chat √ x x x x https://huggingface.co/Qwen/Qwen-VL-Chat 56 MiniCPM-v2 √ x x x x https://huggingface.co/HwwwH/MiniCPM-V-2 注意:需要修改源文件site-packages/timm/layers/pos_embed.py,在第46行上面新增一行代码,如下: posemb = posemb.contiguous() #新增 posemb = F.interpolate(posemb, size=new_size, mode=interpolation, antialias=antialias) 57 gte-Qwen2-7B-instruct √ x x x x Alibaba-NLP/gte-Qwen2-7B-instruct at main (huggingface.co) 58 bge-large-en-v1.5 √ x x x x https://huggingface.co/BAAI/bge-large-en-v1.5 59 bge-base-en-v1.5 √ x x x x https://huggingface.co/BAAI/bge-base-en-v1.5 表2 支持的多模态模型列表和权重获取地址 序号 模型名称 是否支持fp16/bf16推理 是否支持W4A16量化 是否支持W8A8量化 是否支持W8A16量化 是否支持 kv-cache-int8量化 开源权重获取地址 1 internvl2-8B √ x x x x https://huggingface.co/OpenGVLab/InternVL2-8B/tree/main 2 internvl2-26B √ x x x x https://huggingface.co/OpenGVLab/InternVL2-26B/tree/main 3 internvl2-40B √ x x x x https://huggingface.co/OpenGVLab/InternVL2-40B/tree/main 4 internVL2-Llama3-76B √ √ x x x https://huggingface.co/OpenGVLab/InternVL2-Llama3-76B/tree/main https://huggingface.co/OpenGVLab/InternVL2-Llama3-76B-AWQ 6 MiniCPM-v2.6 √ x x x x https://huggingface.co/openbmb/MiniCPM-V-2_6/tree/main 7 qwen2-vl-2B √ x x x x https://huggingface.co/Qwen/Qwen2-VL-2B-Instruct/tree/main 8 qwen2-vl-7B √ x x x x https://huggingface.co/Qwen/Qwen2-VL-7B-Instruct/tree/main 9 qwen2-vl-72B √ √ x x x https://huggingface.co/Qwen/Qwen2-VL-72B-Instruct/tree/main https://huggingface.co/Qwen/Qwen2-VL-72B-Instruct-AWQ 10 llava-1.5-7b √ x x x x https://huggingface.co/llava-hf/llava-1.5-7b-hf/tree/main 11 llava-1.5-13b √ x x x x https://huggingface.co/llava-hf/llava-1.5-13b-hf/tree/main 12 llava-v1.6-7b √ x x x x https://huggingface.co/llava-hf/llava-v1.6-vicuna-7b-hf/tree/main 13 llava-v1.6-13b √ x x x x https://huggingface.co/llava-hf/llava-v1.6-vicuna-13b-hf/tree/main 14 llava-v1.6-34b √ x x x x https://huggingface.co/llava-hf/llava-v1.6-34b-hf/tree/main 15 llava-onevision-qwen2-0.5b-ov-hf √ x x x x https://huggingface.co/llava-hf/llava-onevision-qwen2-0.5b-ov-hf 16 llava-onevision-qwen2-7b-ov-hf √ x x x x https://huggingface.co/llava-hf/llava-onevision-qwen2-7b-ov-hf 17 internvl2.5-4B √ x x x x https://huggingface.co/OpenGVLab/InternVL2_5-4B 18 internvl2.5-8B √ x x x x https://huggingface.co/OpenGVLab/InternVL2_5-8B 19 internvl2.5-78B √ x x x x https://huggingface.co/OpenGVLab/InternVL2_5-78B 各模型支持的卡数请参见各模型支持的最小卡数和最大序列章节。 父主题: 主流开源大模型基于Lite Server适配Ascend-vLLM PyTorch NPU推理指导(6.5.901)
  • per-tensor静态量化场景 在GPU机器上使用tensorRT 0.9.0版本工具进行模型量化,工具下载使用指导请参见https://github.com/NVIDIA/TensorRT-LLM/tree/v0.9.0。 量化脚本convert_checkpoint.py存放在TensorRT-LLM/examples路径对应的模型文件夹下,例如:llama模型对应量化脚本的路径是examples/llama/convert_checkpoint.py。 执行convert_checkpoint.py脚本进行权重转换生成量化系数。
  • Ascend-vLLM支持的特性介绍 表1 Ascend-vLLM支持的特性 特性名称 特性说明 调度 Page-attention 分块管理kvcache,提升吞吐。 Continuous batching 迭代级调度,动态调整batch,降低延迟,提升吞吐。 Multi-step 一次调度多次推理,降低调度上的cpu-overhead。 量化 W4A16-AWQ、GPTQ 权重Int4量化,降低显存消耗和时延。小并发时延提升80%,精度损失2%以内。 W8A8-smoothQuant 权重Int8量化,降低显存消耗,吞吐提升30%;精度损失1.5%以内。 W8A16-GPTQ Int8量化,降低显存消耗,提高吞吐20%。精度损失1%以内。 Kv8 Kv-cache量化,提高吞吐,支持更长序列。 高效解码 Auto-prefix-caching 前缀缓存,降低首token时延。在system prompt较长或多轮对话场景收益明显 Chunked-prefill 又名split-fuse。全量增量同时推理,提高资源利用率,提升吞吐。 Speculative Decoding 支持大小模型投机推理和eager模式投机,提升推理性能。 图模式 Cuda-graph/cann-graph 记录算子执行的依赖关系构图;消除python host耗时;且支持动态shape。 Torch.compile Torch.dynamo构图,转ascend-GE后端推理;使用静态分档。 实例复用 Multi-lora 多lora挂载,多个不同微调模型共用一份权重同时部署。 控制输出 Guided Decoding 通过特定模式控制模型输出。 Beam search 通过beamsearch输出多个候选结果。 分离部署 PD分离部署 全量、增量分离部署,提高资源利用率,提升体验。 剪枝 FASP (Fast and Accurate Structured Pruning) 剪枝 FASP剪枝是一种结构化稀疏剪枝方法,能有效降低模型显存以及需要部署的资源依赖,减小推理过程中的计算量,降低增量推理时延,提升吞吐。
  • Ascend-vLLM概述 vLLM是GPU平台上广受欢迎的大模型推理框架,因其高效的continuous batching和pageAttention功能而备受青睐。此外,vLLM还具备投机推理和自动前缀缓存等关键功能,使其在学术界和工业界都得到了广泛应用。 Ascend-vLLM是华为云针对NPU优化的推理框架,继承了vLLM的优点,并通过特定优化实现了更高的性能和易用性。它使得在NPU卡上运行大模型变得更加高效和便捷,为用户带来了极大的便利和性能提升。Ascend-vLLM可广泛应用于各种大模型推理任务,特别是在需要高性能和高效率的场景中,如自然语言处理、图像生成和 语音识别 等。 Ascend-vLLM的主要特点 易用性:Ascend-vLLM简化了在大模型上的部署和推理过程,使开发者可以更轻松地使用它。 易开发性:提供了友好的开发和调试环境,便于模型的调整和优化。 高性能:通过自研特性和针对NPU的优化,如PD分离、前后处理、sample等,实现了高效的推理性能。
  • 步骤六:进入容器 进入容器。 docker exec -it -u ma-user ${container_name} /bin/bash 评估推理资源。运行如下命令,返回NPU设备信息可用的卡数。 npu-smi info # 启动推理服务之前检查卡是否被占用、端口是否被占用,是否有对应运行的进程 如出现错误,可能是机器上的NPU设备没有正常安装,或者NPU镜像被其他容器挂载。请先正常安装固件和驱动,或释放被挂载的NPU。 驱动版本要求是23.0.6。如果不符合要求请参考安装固件和驱动章节升级驱动。启动后容器默认端口是8080。 配置需要使用的NPU卡为容器中的第几张卡。例如:实际使用的是容器中第1张卡,此处填写“0”。 export ASCEND_RT_VISIBLE_DEVI CES =0 如果启动服务需要使用多张卡,则按容器中的卡号依次编排。例如:实际使用的是容器中第1张和第2张卡,此处填写为“0,1”,以此类推。 export ASCEND_RT_VISIBLE_DEVICES=0,1 可以通过命令npu-smi info查询NPU卡为容器中的第几张卡。例如下图查询出两张卡,如果希望使用第一和第二张卡,则“export ASCEND_RT_VISIBLE_DEVICES=0,1”,注意编号不是填4、5。 图1 查询结果 启动推理服务的具体操作步骤请参见启动推理服务。
  • 步骤一:检查环境 SSH登录机器后,检查NPU设备检查。运行如下命令,返回NPU设备信息。 npu-smi info # 在每个实例节点上运行此命令可以看到NPU卡状态 npu-smi info -l | grep Total # 在每个实例节点上运行此命令可以看到总卡数,用来确认对应卡数已经挂载 npu-smi info -t board -i 1 | egrep -i "software|firmware" #查看驱动和固件版本 如出现错误,可能是机器上的NPU设备没有正常安装,或者NPU镜像被其他容器挂载。请先正常安装固件和驱动,或释放被挂载的NPU。 驱动版本要求是23.0.6。如果不符合要求请参考安装固件和驱动章节升级驱动。 检查docker是否安装。 docker -v #检查docker是否安装 如尚未安装,运行以下命令安装docker。 yum install -y docker-engine.aarch64 docker-engine-selinux.noarch docker-runc.aarch64 配置IP转发,用于容器内的网络访问。执行以下命令查看net.ipv4.ip_forward配置项的值,如果为1,可跳过此步骤。 sysctl -p | grep net.ipv4.ip_forward 如果net.ipv4.ip_forward配置项的值不为1,执行以下命令配置IP转发。 sed -i 's/net\.ipv4\.ip_forward=0/net\.ipv4\.ip_forward=1/g' /etc/sysctl.conf sysctl -p | grep net.ipv4.ip_forward
  • 步骤四:制作推理镜像 解压AscendCloud压缩包及该目录下的推理代码AscendCloud-LLM-xxx.zip和算子包AscendCloud-OPP-xxx.zip,并执行build_image.sh脚本制作推理镜像。安装过程需要连接互联网git clone,请确保机器环境可以访问公网。 unzip AscendCloud-*.zip -d ./AscendCloud && cd ./AscendCloud && unzip AscendCloud-OPP-*.zip && unzip AscendCloud-OPP-*-torch-2.1.0-py39-*.zip -d ./AscendCloud-OPP && cd .. && unzip ./AscendCloud/AscendCloud-LLM-*.zip -d ./AscendCloud/AscendCloud-LLM && cd ./AscendCloud/AscendCloud-LLM/llm_inference/ascend_vllm/ && sh build_image.sh --base-image=${base_image} --image-name=${image_name} 参数说明: ${base_image}为基础镜像地址。 ${image_name}为推理镜像名称,可自行指定。 运行完后,会生成推理所需镜像。 多模态场景下,如果推理需要使用NPU加速图片预处理(仅适配了llava-1.5模型),启动时需要设置export ENABLE_USE_DVPP=1,需要安装torchvision_npu,可放到镜像制作脚本./AscendCloud/AscendCloud-LLM/llm_inference/ascend_vllm/Dockfile中。内容如下: git clone https://gitee.com/ascend/vision.git vision_npu cd vision_npu git checkout v0.16.0-6.0.rc3 # 安装依赖库 pip3 install -r requirement.txt # 编包 python setup.py bdist_wheel # 安装 cd dist pip install torchvision_npu-0.16.*.whl
  • 步骤五:启动容器 启动容器镜像前请先按照参数说明修改${}中的参数。docker启动失败会有对应的error提示,启动成功会有对应的docker id生成,并且不会报错。 docker run -itd \ --device=/dev/davinci0 \ --device=/dev/davinci1 \ --device=/dev/davinci2 \ --device=/dev/davinci3 \ --device=/dev/davinci4 \ --device=/dev/davinci5 \ --device=/dev/davinci6 \ --device=/dev/davinci7 \ -v /etc/localtime:/etc/localtime \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /etc/ascend_install.info:/etc/ascend_install.info \ --device=/dev/davinci_manager \ --device=/dev/devmm_svm \ --device=/dev/hisi_hdc \ -v /var/log/npu/:/usr/slog \ -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \ -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ -v ${dir}:${container_work_dir} \ --net=host \ --name ${container_name} \ ${image_id} \ /bin/bash 参数说明: --device=/dev/davinci0,..., --device=/dev/davinci7:挂载NPU设备,示例中挂载了8张卡davinci0~davinci7。 -v ${dir}:${container_work_dir} 代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的大文件系统,dir为宿主机中文件目录,${container_work_dir}为要挂载到的容器中的目录。为方便两个地址可以相同。 容器不能挂载到/home/ma-user目录,此目录为ma-user用户家目录。如果容器挂载到/home/ma-user下,拉起容器时会与基础镜像冲突,导致基础镜像不可用。 driver及npu-smi需同时挂载至容器。 不要将多个容器绑到同一个NPU上,会导致后续的容器无法正常使用NPU功能。 --name ${container_name}:容器名称,进入容器时会用到,此处可以自己定义一个容器名称。 {image_id} 为docker镜像的ID,即第四步中生成的新镜像id,在宿主机上可通过docker images查询得到。
  • 步骤三:上传代码包和权重文件 上传安装依赖软件推理代码AscendCloud-LLM-xxx.zip和算子包AscendCloud-OPP-xxx.zip到主机中,包获取路径请参见表2。 将权重文件上传到DevServer机器中。权重文件的格式要求为Huggingface格式。开源权重文件获取地址请参见支持的模型列表。 如果使用模型训练后的权重文件进行推理,模型训练及训练后的权重文件转换操作可以参考大模型训练相关文档。 权重要求放在磁盘的指定目录,并做目录大小检查,参考命令如下。 df -h
  • Step4 启动容器镜像 启动容器镜像。启动前请先按照参数说明修改${}中的参数。 docker run -itd --net=host \ --device=/dev/davinci0 \ --device=/dev/davinci_manager \ --device=/dev/devmm_svm \ --device=/dev/hisi_hdc \ --shm-size=1024g \ -v /usr/local/dcmi:/usr/local/dcmi \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /var/log/npu/:/usr/slog \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ -v ${work_dir}:${container_work_dir} \ --name ${container_name} \ ${image_id} \ /bin/bash 参数说明: -v ${work_dir}:${container_work_dir}:代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的文件系统。work_dir为宿主机中工作目录,目录下存放着代码、数据等文件。container_work_dir为要挂载到的容器中的目录。为方便两个地址可以相同。 容器不能挂载到/home/ma-user目录,此目录为ma-user用户家目录。如果容器挂载到/home/ma-user下,拉起容器时会与基础镜像冲突,导致基础镜像不可用。 driver及npu-smi需同时挂载至容器。 --name ${container_name}:容器名称,进入容器时会用到,此处可以自己定义一个容器名称。 ${image_id}:镜像ID,通过docker images查看刚拉取的镜像ID。 通过容器名称进入容器中。默认使用ma-user用户,后续所有操作步骤都在ma-user用户下执行。 docker exec -it ${container_name} bash
  • Step5 下载并适配代码 在容器中解压代码包。 unzip AscendCloud-AIGC-*.zip rm -rf AscendCloud-AIGC-* 执行wav2lip推理插件的安装脚本。 cd multimodal_algorithm/Wav2Lip/inference/f361e9527b917a435928a10931fee9ac7be109cd source install.sh 从Github官网下载Wav2lip权重文件和Wav2Lip+GAN权重文件(下载链接),并放在容器的checkpoints目录下。上一步执行完source install.sh命令后,会自动生成checkpoints目录。 图1 下载权重文件 从官网下载模型s3fd-619a316812.pth,并重命名为s3fd.pth,放在容器路径face_detection/detection/sfd下。上一步执行完source install.sh命令后,会自动生成face_detection/detection/sfd目录。
  • Step1 准备环境 请参考Lite Server资源开通,购买Lite Server资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。 当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问Openstack的管理地址(169.254.169.254),以防止容器获取宿主机的元数据。具体操作请参见禁止容器获取宿主机元数据。 SSH登录机器后,检查NPU设备检查。运行如下命令,返回NPU设备信息。 npu-smi info # 在每个实例节点上运行此命令可以看到NPU卡状态 npu-smi info -l | grep Total # 在每个实例节点上运行此命令可以看到总卡数 如出现错误,可能是机器上的NPU设备没有正常安装,或者NPU镜像被其他容器挂载。请先正常安装固件和驱动,或释放被挂载的NPU。 检查docker是否安装。 docker -v #检查docker是否安装 如尚未安装,运行以下命令安装docker。 yum install -y docker-engine.aarch64 docker-engine-selinux.noarch docker-runc.aarch64 配置IP转发,用于容器内的网络访问。执行以下命令查看net.ipv4.ip_forward配置项的值,如果为1,可跳过此步骤。 sysctl -p | grep net.ipv4.ip_forward 如果net.ipv4.ip_forward配置项的值不为1,执行以下命令配置IP转发。 sed -i 's/net\.ipv4\.ip_forward=0/net\.ipv4\.ip_forward=1/g' /etc/sysctl.conf sysctl -p | grep net.ipv4.ip_forward
  • 获取软件和镜像 表2 获取软件和镜像 分类 名称 获取路径 插件代码包 AscendCloud-6.3.907-xxx.zip软件包中的AscendCloud-AIGC-6.3.907-xxx.zip 说明: 包名中的xxx表示具体的时间戳,以包名的实际时间为准。 获取路径:Support-E 说明: 如果上述软件获取路径打开后未显示相应的软件信息,说明您没有下载权限,请联系您所在企业的华为方技术支持下载获取。 基础镜像 西南-贵阳一: swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_1_ascend:pytorch_2.1.0-cann_8.0.rc2-py_3.9-hce_2.0.2312-aarch64-snt9b-20240727152329-0f2c29a 从SWR拉取。
  • 步骤四:启动scheduler实例 建议在PD服务(即全量推理和增量推理服务)启动后,再启动scheduler服务。 启动scheduler容器。启动容器镜像前请先按照参数说明修改${}中的参数。docker启动失败会有对应的error提示,启动成功会有对应的docker id生成,并且不会报错。 docker run -itd \ -v /etc/localtime:/etc/localtime \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /etc/ascend_install.info:/etc/ascend_install.info \ --device=/dev/davinci_manager \ --device=/dev/devmm_svm \ --device=/dev/hisi_hdc \ -v /var/log/npu/:/usr/slog \ -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \ -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ -v ${dir}:${container_work_dir} \ --net=host \ --name ${container_name} \ ${image_id} \ /bin/bash 参数说明: -v ${dir}:${container_work_dir} 代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的大文件系统,dir为宿主机中文件目录,${container_work_dir}为要挂载到的容器中的目录。为方便两个地址可以相同。 容器不能挂载到/home/ma-user目录,此目录为ma-user用户家目录。如果容器挂载到/home/ma-user下,拉起容器时会与基础镜像冲突,导致基础镜像不可用。 driver及npu-smi需同时挂载至容器。 --name ${container_name}:容器名称,进入容器时会用到,此处可以自己定义一个容器名称。 {image_id} 为docker镜像的ID,即步骤四:制作推理镜像生成的镜像ID,在宿主机上可通过docker images查询得到。 进入容器。 docker exec -it -u ma-user ${container-name} /bin/bash 启动scheduler实例,命令如下。 export GLOBAL_RANK_TABLE_FILE_PATH=global_ranktable_10.**.**.18.json export RANK_TABLE_FILE_PATH=local_rank_table_10.**.**.18_host.json export NODE_PORTS=8088,8089 export USE_OPENAI=1 export no_proxy=localhost,127.0.0.1,10.**.**.18 sh AscendCloud-LLM/llm_tools/PD_separate/start_servers.sh \ --model=${model} \ --tensor-parallel-size=2 \ --max-model-len=4096 \ --max-num-seqs=256 \ --max-num-batched-tokens=4096 \ --host=0.0.0.0 \ --port=9000 \ --served-model-name ${served-model-name} # 当前schduler端口port对外提供推理服务,故使用该端口进行性能验证和精度对齐 其中环境变量说明如下: GLOBAL_RANK_TABLE_FILE_PATH:global rank_table的路径,必选。不同实例类型的global rank_table均一致。 NODE_PORTS:仅在服务入口实例生效,用于与全量推理实例、增量推理实例的信息交互。该参数入参为形如{port1},{port2},{portn}的字符串,与全量/增量推理实例启动的--port参数相关,--port表示服务部署的端口。每个全量/增量推理实例基于配置的端口号(--port)启动服务,并按照global rank_table中的全量实例、增量实例的顺序,对全量推理实例、增量推理实例启动的端口号进行排序,端口之间用`,`分隔开作为该环境变量的输入。当前端口9000是对外服务端口,而8088、8089则为scheduler调度推理服务端口。 USE_OPENAI:仅在服务入口实例生效,用于配置api-server服务是否使用openai服务,默认为1。当配置为1时,启动服务为openai服务;当配置为0时,启动服务为vllm服务。 no_proxy:可选,避免scheduler实例和P、D实例之间访问时走不必要的网关。 其中常见的参数如下, --host:服务部署的IP --port:服务部署的端口,注意如果不同实例部署在一台机器上,不同实例需要使用不同端口号。分离部署对外服务使用的是scheduler实例端口,在后续推理性能测试和精度测试时,服务端口需要和scheduler实例端口保持一致。 --model:HuggingFace下载的官方权重 --max-num-seqs:同时处理的最大句子数量 --max-model-len:模型能处理的请求输入+输出的token长度 --max-num-batched-tokens:最多会使用多少token,必须大于或等于--max-model-len,推荐使用4096或8192 --tensor-parallel-size:模型并行数量 --served-model-name:openai服务的model入参名称,仅在环境变量USE_OPENAI=1时候生效。 --quantization:如果需要增加模型量化功能,启动推理服务前,先参考量化章节对模型做量化处理。 --prefill-routing-policy:全量节点路由策略,支持RoundRobin(轮询,默认)、FreeKVFirst(优先调度到空闲KV最多的节点)、BLB(优先调度到排队请求数量最少的节点)三种。
  • 约束限制 全量和增量节点的local rank table必须一一对应。 全量和增量节点不能使用同一个端口。 scheduler实例中NODE_PORTS=8088,8089;端口设置顺序必须与global rank table文件中各全量和增量节点顺序一致,否则会报错。 确保scheduler实例和P、D实例之间网络通畅,检查代理设置例如no_proxy环境变量,避免scheduler访问P、D实例时走不必要的网关。
  • 步骤二:启动全量推理实例 以下介绍如何启动全量推理实例。 启动容器镜像前请先按照参数说明修改${}中的参数。docker启动失败会有对应的error提示,启动成功会有对应的docker id生成,并且不会报错。 docker run -itd \ --device=/dev/davinci4 \ --device=/dev/davinci5 \ -v /etc/localtime:/etc/localtime \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /etc/ascend_install.info:/etc/ascend_install.info \ --device=/dev/davinci_manager \ --device=/dev/devmm_svm \ --device=/dev/hisi_hdc \ -v /var/log/npu/:/usr/slog \ -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \ -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ -v ${dir}:${container_work_dir} \ --net=host \ --name ${container_name} \ ${image_id} \ /bin/bash 参数说明: --device=/dev/davinci0,..., --device=/dev/davinci7:挂载NPU设备,示例中挂载了2张卡davinci4、davinci5。 -v ${dir}:${container_work_dir} 代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的大文件系统,dir为宿主机中文件目录,${container_work_dir}为要挂载到的容器中的目录。为方便两个地址可以相同。 说明: 容器不能挂载到/home/ma-user目录,此目录为ma-user用户家目录。如果容器挂载到/home/ma-user下,拉起容器时会与基础镜像冲突,导致基础镜像不可用。 driver及npu-smi需同时挂载至容器。 不要将多个容器绑到同一个NPU上,会导致后续的容器无法正常使用NPU功能。 如果需要多个全量实例,每个全量都需要启动一个容器,只挂载对应的NPU --name ${container_name}:容器名称,进入容器时会用到,此处可以自己定义一个容器名称。 {image_id} 为docker镜像的ID,即步骤四:制作推理镜像中生成的镜像ID,在宿主机上可通过docker images查询得到。 进入容器。 docker exec -it -u ma-user ${container-name} /bin/bash 启动全量推理实例,命令如下。 export GLOBAL_RANK_TABLE_FILE_PATH=global_ranktable_10.**.**.18.json export RANK_TABLE_FILE_PATH=local_rank_table_10.**.**.18_45.json export NODE_PORTS=8088,8089 export USE_OPENAI=1 sh AscendCloud-LLM/llm_tools/PD_separate/start_servers.sh \ --model=${model} \ --tensor-parallel-size=2 \ --max-model-len=4096 \ --max-num-seqs=256 \ --max-num-batched-tokens=4096 \ --host=0.0.0.0 \ --port=8088 \ --served-model-name ${served-model-name} 其中环境变量说明如下: GLOBAL_RANK_TABLE_FILE_PATH:global rank_table的路径,必选。不同实例类型的global rank_table均一致。 RANK_TABLE_FILE_PATH:local rank_table的路径,必选。当实例类型为全量推理实例或者增量推理实例,local rank_table配置local_ranktable_xx_yy.json文件,其中xx表示当前实例的IP地址,yy表示当前实例使用的device_id信息;当实例类型为服务入口实例,local rank_table配置local_ranktable_xx_host.json文件,其中xx表示当前实例的IP地址。 NODE_PORTS:仅在服务入口实例生效,用于与全量推理实例、增量推理实例的信息交互。该参数入参为形如{port1},{port2},{portn}的字符串,与全量或增量推理实例启动的--port参数相关。--port表示服务部署的端口。每个全量/增量推理实例基于配置的端口号(--port)启动服务,并按照global rank_table中的全量实例、增量实例的顺序,对全量推理实例、增量推理实例启动的端口号进行排序,端口之间用`,`分隔开作为该环境变量的输入。 USE_OPENAI:仅在服务入口实例生效,用于配置api-server服务是否使用openai服务,默认为1。当配置为1时,启动服务为openai服务;当配置为0时,启动服务为vllm服务。 其中常见的参数如下: --host:服务部署的IP --port:服务部署的端口,注意如果不同实例部署在一台机器上,不同实例需要使用不同端口号 --model:HuggingFace下载的官方权重 --max-num-seqs:同时处理的最大句子数量 --max-model-len:模型能处理的请求输入+输出的token长度 --max-num-batched-tokens:最多会使用多少token,必须大于或等于--max-model-len,推荐使用4096或8192 --tensor-parallel-size:模型并行数量 --served-model-name:OpenAI服务的model入参名称,仅在环境变量USE_OPENAI=1时生效。 --quantization:如果需要增加模型量化功能,启动推理服务前,先参考量化章节对模型做量化处理。 --prefill-batching-policy:针对PD分离场景下的P实例调度策略选择,支持fcfs(先来先服务,vllm默认)及gtsf(Group Time Short First,组内等待时间最短优先)两种策略,若负载比较高且请求长度差异大可以选择gtsf进行尝试。 参数定义和使用方式与vLLM0.6.3版本一致,此处介绍关键参数。详细参数解释请参见https://github.com/vllm-project/vllm/blob/main/vllm/engine/arg_utils.py。
  • 步骤三:启动增量推理实例 启动增量推理容器 启动容器镜像前请先按照参数说明修改${}中的参数。docker启动失败会有对应的error提示,启动成功会有对应的docker id生成,并且不会报错。 docker run -itd \ --device=/dev/davinci6 \ --device=/dev/davinci7 \ -v /etc/localtime:/etc/localtime \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /etc/ascend_install.info:/etc/ascend_install.info \ --device=/dev/davinci_manager \ --device=/dev/devmm_svm \ --device=/dev/hisi_hdc \ -v /var/log/npu/:/usr/slog \ -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \ -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ -v ${dir}:${container_work_dir} \ --net=host \ --name ${container_name} \ ${image_id} \ /bin/bash 参数说明: --device=/dev/davinci0,..., --device=/dev/davinci7:挂载NPU设备,示例中挂载了2张卡davinci6、davinci7。 -v ${dir}:${container_work_dir} 代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的大文件系统,dir为宿主机中文件目录,${container_work_dir}为要挂载到的容器中的目录。为方便两个地址可以相同。 容器不能挂载到/home/ma-user目录,此目录为ma-user用户家目录。如果容器挂载到/home/ma-user下,拉起容器时会与基础镜像冲突,导致基础镜像不可用。 driver及npu-smi需同时挂载至容器。 不要将多个容器绑到同一个NPU上,会导致后续的容器无法正常使用NPU功能。 如果需要多个增量实例,每个增量都需要启动一个容器,只挂载对应的NPU --name ${container_name}:容器名称,进入容器时会用到,此处可以自己定义一个容器名称。 {image_id} 为docker镜像的ID,即步骤四:制作推理镜像中生成的镜像ID,在宿主机上可通过docker images查询得到。 进入容器 docker exec -it -u ma-user ${container-name} /bin/bash 启动增量推理实例,命令如下。 export GLOBAL_RANK_TABLE_FILE_PATH=global_ranktable_10.**.**.18.json export RANK_TABLE_FILE_PATH=local_rank_table_10.**.**.18_67.json export NODE_PORTS=8088,8089 export USE_OPENAI=1 sh AscendCloud-LLM/llm_tools/PD_separate/start_servers.sh \ --model=${model} \ --tensor-parallel-size=2 \ --max-model-len=4096 \ --max-num-seqs=256 \ --max-num-batched-tokens=4096 \ --host=0.0.0.0 \ --port=8089 \ --served-model-name ${served-model-name} 其中环境变量说明如下: GLOBAL_RANK_TABLE_FILE_PATH:global rank_table的路径,必选。不同实例类型的global rank_table均一致。 RANK_TABLE_FILE_PATH:local rank_table的路径,必选。当实例类型为全量推理实例或者增量推理实例,local rank_table配置local_ranktable_xx_yy.json文件,其中xx表示当前实例的IP地址,yy表示当前实例使用的device_id信息;当实例类型为服务入口实例,local rank_table配置local_ranktable_xx_host.json文件,其中xx表示当前实例的IP地址。 NODE_PORTS:仅在服务入口实例生效,用于与全量推理实例、增量推理实例的信息交互。该参数入参为形如{port1},{port2},{portn}的字符串,与全量/增量推理实例启动的--port参数相关,--port表示服务部署的端口。每个全量/增量推理实例基于配置的端口号(--port)启动服务,并按照global rank_table中的全量实例、增量实例的顺序,对全量推理实例、增量推理实例启动的端口号进行排序,端口之间用,(英文逗号)分隔开作为该环境变量的输入。 USE_OPENAI:仅在服务入口实例生效,用于配置api-server服务是否使用openai服务,默认为1。当配置为1时,启动服务为openai服务;当配置为0时,启动服务为vllm服务。 其中常见的参数如下: --host:服务部署的IP地址 --port:服务部署的端口,注意如果不同实例部署在一台机器上,不同实例需要使用不同端口号 --model:HuggingFace下载的官方权重 --max-num-seqs:同时处理的最大句子数量 --max-model-len:模型能处理的请求输入+输出的token长度 --max-num-batched-tokens:最多会使用多少token,必须大于或等于--max-model-len,推荐使用4096或8192 --tensor-parallel-size:模型并行数量 --served-model-name:OpenAI服务的model入参名称,仅在环境变量USE_OPENAI=1时生效。 --quantization:如果需要增加模型量化功能,启动推理服务前,先参考量化章节对模型做量化处理。
  • 什么是PD分离部署 大模型推理是自回归的过程,有以下两阶段: Prefill阶段(全量推理) 将用户请求的prompt传入大模型,进行计算,中间结果写入KVCache并推出第1个token,属于计算密集型。 Decode阶段(增量推理) 将请求的前1个token传入大模型,从显存读取前文产生的KVCache再进行计算,属于访存密集型。 PD分离部署场景下,大模型推理的Prefill阶段(全量推理)和Decode阶段(增量推理)分别实例化部署在不同的推理卡资源上同时进行推理,用于提高资源利用效率。 PD分离结合Prefill阶段的计算密集型特性,以及Decode阶段的访存密集型特性,通过调节PD节点数量配比来提升Decode节点的batch size来充分发挥NPU卡的算力,进而提升集群整体吞吐。 此外,在Decode平均低时延约束场景,PD分离相比PD混合部署,更加能够发挥性能优势。 分离部署的实例类型启动分为以下三个阶段: 启动全量推理实例:必须为NPU实例,用于启动全量推理服务,负责输入的全量推理。全量推理占用至少1个容器。 启动增量推理实例:必须为NPU实例,用于启动增量推理服务,负责输入的增量推理。增量推理占用至少1个容器。 启动scheduler实例:可为CPU实例,用于启动api-server服务,负责接收推理请求,向全量或增量推理实例分发请求,收集推理结果并向客户端返回推理结果。服务调度实例不占用显卡资源,建议增加1个容器,也可以在全量推理或增量推理的容器上启动。
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全