AI开发平台ModelArts
AI开发平台ModelArts
- 最新动态
- 功能总览
- 服务公告
- 产品介绍
- 计费说明
- 快速入门
-
ModelArts用户指南(Standard)
- ModelArts Standard使用流程
- ModelArts Standard准备工作
- ModelArts Standard资源管理
- 使用自动学习实现零代码AI开发
- 使用Workflow实现低代码AI开发
- 使用Notebook进行AI开发调试
- 数据准备与处理
- 使用ModelArts Standard训练模型
- 使用ModelArts Standard部署模型并推理预测
- 制作自定义镜像用于ModelArts Standard
- ModelArts Standard资源监控
- 使用CTS审计ModelArts服务
- ModelArts用户指南(Studio)
- ModelArts用户指南(Lite Server)
- ModelArts用户指南(Lite Cluster)
- ModelArts用户指南(AI Gallery)
-
最佳实践
- ModelArts最佳实践案例列表
- 昇腾能力应用地图
- DeepSeek系列模型推理
-
LLM大语言模型训练推理
- 在ModelArts Studio基于Qwen2-7B模型实现新闻自动分类
- 主流开源大模型基于Lite Server适配Ascend-vLLM PyTorch NPU推理指导(6.3.912)
- 主流开源大模型基于Lite Server适配ModelLink PyTorch NPU训练指导(6.3.912)
- 主流开源大模型基于Lite Cluster适配ModelLink PyTorch NPU训练指导(6.3.912)
- 主流开源大模型基于Standard+OBS适配ModelLink PyTorch NPU训练指导(6.3.912)
- 主流开源大模型基于Standard+OBS+SFS适配ModelLink PyTorch NPU训练指导(6.3.912)
- 主流开源大模型基于Lite Server适配LlamaFactory PyTorch NPU训练指导(6.3.912)
- 主流开源大模型基于Lite Server适配PyTorch NPU推理指导(6.3.911)
- 主流开源大模型基于Standard适配PyTorch NPU推理指导(6.3.911)
- 主流开源大模型基于Lite Cluster适配PyTorch NPU推理指导(6.3.911)
- 主流开源大模型基于Lite Server适配ModelLink PyTorch NPU训练指导(6.3.911)
- 主流开源大模型基于Lite Server适配LlamaFactory PyTorch NPU训练指导(6.3.911)
- 主流开源大模型基于Standard+OBS适配ModelLink PyTorch NPU训练指导(6.3.911)
- 主流开源大模型基于Standard+OBS+SFS适配ModelLink PyTorch NPU训练指导(6.3.911)
- 主流开源大模型基于Lite Cluster适配ModelLink PyTorch NPU训练指导(6.3.911)
- 主流开源大模型基于Lite Server适配PyTorch NPU推理指导(6.3.910)
- 主流开源大模型基于Standard适配PyTorch NPU推理指导(6.3.910)
- 主流开源大模型基于Lite Cluster适配PyTorch NPU推理指导(6.3.910)
- 主流开源大模型基于Lite Server适配ModelLink PyTorch NPU训练指导(6.3.910)
- 主流开源大模型基于Lite Server适配LlamaFactory PyTorch NPU训练指导(6.3.910)
- 主流开源大模型基于Standard+OBS适配ModelLink PyTorch NPU训练指导(6.3.910)
- 主流开源大模型基于Standard+OBS+SFS适配ModelLink PyTorch NPU训练指导(6.3.910)
- 主流开源大模型基于Lite Cluster适配ModelLink PyTorch NPU训练指导(6.3.910)
- 主流开源大模型基于Lite Server适配PyTorch NPU推理指导(6.3.909)
- 主流开源大模型基于Standard适配PyTorch NPU推理指导(6.3.909)
- 主流开源大模型基于Lite Cluster适配PyTorch NPU推理指导(6.3.909)
- 主流开源大模型基于Lite Server适配ModelLink PyTorch NPU训练指导(6.3.909)
- 主流开源大模型基于Lite Server适配LlamaFactory PyTorch NPU训练指导(6.3.909)
- 主流开源大模型基于Standard+OBS适配ModelLink PyTorch NPU训练指导(6.3.909)
- 主流开源大模型基于Standard+OBS+SFS适配ModelLink PyTorch NPU训练指导(6.3.909)
- 主流开源大模型基于Lite Cluster适配ModelLink PyTorch NPU训练指导(6.3.909)
- 主流开源大模型基于Lite Server适配PyTorch NPU推理指导(6.3.908)
- 主流开源大模型基于Standard适配PyTorch NPU推理指导(6.3.908)
- 主流开源大模型基于Lite Server适配ModelLink PyTorch NPU训练指导(6.3.908)
- 主流开源大模型基于Lite Server适配LlamaFactory PyTorch NPU训练指导(6.3.908)
- 主流开源大模型基于Standard+OBS适配ModelLink PyTorch NPU训练指导(6.3.908)
- 主流开源大模型基于Standard+OBS+SFS适配ModelLink PyTorch NPU训练指导(6.3.908)
- 主流开源大模型基于Lite Server适配ModelLink PyTorch NPU训练指导(6.3.907)
- 主流开源大模型基于Lite Server适配LlamaFactory PyTorch NPU训练指导(6.3.907)
- 主流开源大模型基于Lite Server适配PyTorch NPU推理指导(6.3.907)
- 主流开源大模型基于Standard+OBS适配PyTorch NPU训练指导(6.3.907)
- 主流开源大模型基于Standard+OBS+SFS适配PyTorch NPU训练指导(6.3.907)
- 主流开源大模型基于Standard适配PyTorch NPU推理指导(6.3.907)
- 主流开源大模型基于Lite Server适配PyTorch NPU训练指导(6.3.906)
- 主流开源大模型基于Lite Server适配PyTorch NPU推理指导(6.3.906)
- 主流开源大模型基于Standard适配PyTorch NPU训练指导(6.3.906)
- 主流开源大模型基于Standard适配PyTorch NPU推理指导(6.3.906)
- 主流开源大模型基于Lite Server适配PyTorch NPU训练指导(6.3.905)
- 主流开源大模型基于LIte Server适配PyTorch NPU推理指导(6.3.905)
- 主流开源大模型基于Standard适配PyTorch NPU训练指导(6.3.905)
- 主流开源大模型基于Standard适配PyTorch NPU推理指导(6.3.905)
-
MLLM多模态模型训练推理
- Qwen-VL基于Standard+OBS+SFS适配PyTorch NPU训练指导(6.3.912)
- Qwen-VL模型基于Standard+OBS适配PyTorch NPU训练指导(6.3.912)
- Qwen-VL基于Lite Server适配PyTorch NPU的Finetune训练指导(6.3.912)
- Qwen-VL基于Lite Server适配PyTorch NPU的推理指导(6.3.909)
- MiniCPM-V2.6基于Lite Server适配PyTorch NPU训练指导(6.3.912)
- MiniCPM-V2.0推理及LoRA微调基于Lite Server适配PyTorch NPU指导(6.3.910)
- InternVL2基于LIte Server适配PyTorch NPU训练指导(6.3.912)
- LLaVA-NeXT基于Lite Server适配PyTorch NPU训练微调指导(6.3.912)
- LLaVA模型基于Lite Server适配PyTorch NPU预训练指导(6.3.912)
- LLaVA模型基于Lite Server适配PyTorch NPU推理指导(6.3.906)
- Llama 3.2-Vision基于Lite Server适配Pytorch NPU训练微调指导(6.3.912)
- LLaMA-VID基于Lite Server适配PyTorch NPU推理指导(6.3.910)
- moondream2基于Lite Server适配PyTorch NPU推理指导
-
文生图模型训练推理
- FlUX.1基于Lite Server适配PyTorch NPU推理指导(6.3.912)
- FLUX.1基于DevSever适配PyTorch NPU Finetune&Lora训练指导(6.3.911)
- Hunyuan-DiT基于Lite Server部署适配PyTorch NPU推理指导(6.3.909)
- SD3.5基于Lite Server适配PyTorch NPU的推理指导(6.3.912)
- SD3基于Lite Server适配PyTorch NPU的训练指导(6.3.912)
- SD3 Diffusers框架基于Lite Server适配PyTorch NPU推理指导(6.3.912)
- SD1.5&SDXL Diffusers框架基于Lite Server适配PyTorch NPU训练指导(6.3.908)
- SD1.5&SDXL Kohya框架基于DevServer适配PyTorch NPU训练指导(6.3.908)
- SDXL基于Standard适配PyTorch NPU的LoRA训练指导(6.3.908)
- SD3 Diffusers框架基于Lite Server适配PyTorch NPU推理指导(6.3.907)
- SDXL&SD1.5 ComfyUI基于Lite Cluster适配NPU推理指导(6.3.906)
- SDXL基于Standard适配PyTorch NPU的Finetune训练指导(6.3.905)
- SDXL基于Lite Server适配PyTorch NPU的Finetune训练指导(6.3.905)
- SDXL基于Lite Server适配PyTorch NPU的LoRA训练指导(6.3.905)
- SD1.5基于Lite Server适配PyTorch NPU Finetune训练指导(6.3.904)
- Open-Clip基于Lite Server适配PyTorch NPU训练指导
- AIGC工具tailor使用指导
- 文生视频模型训练推理
- 数字人模型训练推理
- 内容审核模型训练推理
- GPU业务迁移至昇腾训练推理
- Standard权限管理
- Standard自动学习
- Standard开发环境
- Standard模型训练
- Standard推理部署
- 历史待下线案例
-
API参考
- 使用前必读
- API概览
- 如何调用API
-
Workflow工作流管理
- 获取Workflow工作流列表
- 新建Workflow工作流
- 删除Workflow工作流
- 查询Workflow工作流
- 修改Workflow工作流
- 总览Workflow工作流
- 查询Workflow待办事项
- 在线服务鉴权
- 创建在线服务包
- 获取Execution列表
- 新建Workflow Execution
- 删除Workflow Execution
- 查询Workflow Execution
- 更新Workflow Execution
- 管理Workflow Execution
- 管理Workflow StepExecution
- 获取Workflow工作流节点度量信息
- 新建消息订阅Subscription
- 删除消息订阅Subscription
- 查询消息订阅Subscription详情
- 更新消息订阅Subscription
- 创建工作流定时调度
- 查询工作流定时调度详情
- 删除工作流定时调度信息
- 更新工作流定时调度信息
-
开发环境管理
- 创建Notebook实例
- 查询Notebook实例列表
- 查询所有Notebook实例列表
- 查询Notebook实例详情
- 更新Notebook实例
- 删除Notebook实例
- 通过运行的实例保存成容器镜像
- 查询Notebook支持的有效规格列表
- 查询Notebook支持的可切换规格列表
- 查询运行中的Notebook可用时长
- Notebook时长续约
- 启动Notebook实例
- 停止Notebook实例
- 获取动态挂载OBS实例信息列表
- 动态挂载OBS
- 获取动态挂载OBS实例详情
- 动态卸载OBS
- 添加资源标签
- 删除资源标签
- 查询Notebook资源类型下的标签
- 查询支持的镜像列表
- 注册自定义镜像
- 查询用户镜像组列表
- 查询镜像详情
- 删除镜像
-
训练管理
- 创建算法
- 查询算法列表
- 查询算法详情
- 更新算法
- 删除算法
- 获取支持的超参搜索算法
- 创建训练实验
- 创建训练作业
- 查询训练作业详情
- 更新训练作业描述
- 删除训练作业
- 终止训练作业
- 查询训练作业指定任务的日志(预览)
- 查询训练作业指定任务的日志(OBS链接)
- 查询训练作业指定任务的运行指标
- 查询训练作业列表
- 查询超参搜索所有trial的结果
- 查询超参搜索某个trial的结果
- 获取超参敏感度分析结果
- 获取某个超参敏感度分析图像的路径
- 提前终止自动化搜索作业的某个trial
- 获取自动化搜索作业yaml模板的信息
- 获取自动化搜索作业yaml模板的内容
- 创建训练作业标签
- 删除训练作业标签
- 查询训练作业标签
- 获取训练作业事件列表
- 创建训练作业镜像保存任务
- 查询训练作业镜像保存任务
- 获取训练作业支持的公共规格
- 获取训练作业支持的AI预置框架
- AI应用管理
- APP认证管理
- 服务管理
- 资源管理
- DevServer管理
- 授权管理
- 工作空间管理
- 配额管理
- 资源标签管理
- 节点池管理
- 应用示例
- 权限策略和授权项
- 公共参数
-
历史API
-
数据管理(旧版)
- 查询数据集列表
- 创建数据集
- 查询数据集详情
- 更新数据集
- 删除数据集
- 查询数据集的统计信息
- 查询数据集监控数据
- 查询数据集的版本列表
- 创建数据集标注版本
- 查询数据集版本详情
- 删除数据集标注版本
- 查询样本列表
- 批量添加样本
- 批量删除样本
- 查询单个样本信息
- 获取样本搜索条件
- 分页查询团队标注任务下的样本列表
- 查询团队标注的样本信息
- 查询数据集标签列表
- 创建数据集标签
- 批量修改标签
- 批量删除标签
- 按标签名称更新单个标签
- 按标签名称删除标签及仅包含此标签的文件
- 批量更新样本标签
- 查询数据集的团队标注任务列表
- 创建团队标注任务
- 查询团队标注任务详情
- 启动团队标注任务
- 更新团队标注任务
- 删除团队标注任务
- 创建团队标注验收任务
- 查询团队标注验收任务报告
- 更新团队标注验收任务状态
- 查询团队标注任务统计信息
- 查询团队标注任务成员的进度信息
- 团队成员查询团队标注任务列表
- 提交验收任务的样本评审意见
- 团队标注审核
- 批量更新团队标注样本的标签
- 查询标注团队列表
- 创建标注团队
- 查询标注团队详情
- 更新标注团队
- 删除标注团队
- 向标注成员发送邮件
- 查询所有团队的标注成员列表
- 查询标注团队的成员列表
- 创建标注团队的成员
- 批量删除标注团队成员
- 查询标注团队成员详情
- 更新标注团队成员
- 删除标注团队成员
- 查询数据集导入任务列表
- 创建导入任务
- 查询数据集导入任务的详情
- 查询数据集导出任务列表
- 创建数据集导出任务
- 查询数据集导出任务的状态
- 同步数据集
- 查询数据集同步任务的状态
- 查询智能标注的样本列表
- 查询单个智能标注样本的信息
- 分页查询智能任务列表
- 启动智能任务
- 获取智能任务的信息
- 停止智能任务
- 查询处理任务列表
- 创建处理任务
- 查询数据处理的算法类别
- 查询处理任务详情
- 更新处理任务
- 删除处理任务
- 查询数据处理任务的版本列表
- 创建数据处理任务版本
- 查询数据处理任务的版本详情
- 删除数据处理任务的版本
- 查询数据处理任务版本的结果展示
- 停止数据处理任务的版本
- 开发环境(旧版)
- 训练管理(旧版)
-
数据管理(旧版)
- SDK参考
- 场景代码示例
-
故障排除
- 通用问题
- 自动学习
-
开发环境
- 环境配置故障
- 实例故障
- 代码运行故障
- JupyterLab插件故障
-
VS Code连接开发环境失败故障处理
- 在ModelArts控制台界面上单击VS Code接入并在新界面单击打开,未弹出VS Code窗口
- 在ModelArts控制台界面上单击VS Code接入并在新界面单击打开,VS Code打开后未进行远程连接
- VS Code连接开发环境失败时的排查方法
- 远程连接出现弹窗报错:Could not establish connection to xxx
- 连接远端开发环境时,一直处于"Setting up SSH Host xxx: Downloading VS Code Server locally"超过10分钟以上,如何解决?
- 连接远端开发环境时,一直处于"Setting up SSH Host xxx: Copying VS Code Server to host with scp"超过10分钟以上,如何解决?
- 远程连接处于retry状态如何解决?
- 报错“The VS Code Server failed to start”如何解决?
- 报错“Permissions for 'x:/xxx.pem' are too open”如何解决?
- 报错“Bad owner or permissions on C:\Users\Administrator/.ssh/config”如何解决?
- 报错“Connection permission denied (publickey)”如何解决
- 报错“ssh: connect to host xxx.pem port xxxxx: Connection refused”如何解决?
- 报错"ssh: connect to host ModelArts-xxx port xxx: Connection timed out"如何解决?
- 报错“Load key "C:/Users/xx/test1/xxx.pem": invalid format”如何解决?
- 报错“An SSH installation couldn't be found”或者“Could not establish connection to instance xxx: 'ssh' ...”如何解决?
- 报错“no such identity: C:/Users/xx /test.pem: No such file or directory”如何解决?
- 报错“Host key verification failed.'或者'Port forwarding is disabled.”如何解决?
- 报错“Failed to install the VS Code Server.”或“tar: Error is not recoverable: exiting now.”如何解决?
- VS Code连接远端Notebook时报错“XHR failed”
- VS Code连接后长时间未操作,连接自动断开
- VS Code自动升级后,导致远程连接时间过长
- 使用SSH连接,报错“Connection reset”如何解决?
- 使用MobaXterm工具SSH连接Notebook后,经常断开或卡顿,如何解决?
- VS Code连接开发环境时报错Missing GLIBC,Missing required dependencies
- 使用VSCode-huawei,报错:卸载了‘ms-vscode-remote.remot-sdh’,它被报告存在问题
- 使用VS Code连接实例时,发现VS Code端的实例目录和云上目录不匹配
- VSCode远程连接时卡顿,或Python调试插件无法使用如何处理?
-
自定义镜像故障
- Notebook自定义镜像故障基础排查
- 镜像保存时报错“there are processes in 'D' status, please check process status using 'ps -aux' and kill all the 'D' status processes”或“Buildimge,False,Error response from daemon,Cannot pause container xxx”如何解决?
- 镜像保存时报错“container size %dG is greater than threshold %dG”如何解决?
- 保存镜像时报错“too many layers in your image”如何解决?
- 镜像保存时报错“The container size (xG) is greater than the threshold (25G)”如何解决?
- 镜像保存时报错“BuildImage,True,Commit successfully|PushImage,False,Task is running.”
- 使用自定义镜像创建Notebook后打开没有kernel
- 用户自定义镜像自建的conda环境会查到一些额外的包,影响用户程序,如何解决?
- 用户使用ma-cli制作自定义镜像失败,报错文件不存在(not found)
- 用户使用torch报错Unexpected error from cudaGetDeviceCount
- 其他故障
-
训练作业
- OBS操作相关故障
-
云上迁移适配故障
- 无法导入模块
- 训练作业日志中提示“No module named .*”
- 如何安装第三方包,安装报错的处理方法
- 下载代码目录失败
- 训练作业日志中提示“No such file or directory”
- 训练过程中无法找到so文件
- ModelArts训练作业无法解析参数,日志报错
- 训练输出路径被其他作业使用
- PyTorch1.0引擎提示“RuntimeError: std:exception”
- MindSpore日志提示“ retCode=0x91, [the model stream execute failed]”
- 使用moxing适配OBS路径,pandas读取文件报错
- 日志提示“Please upgrade numpy to >= xxx to use this pandas version”
- 重装的包与镜像装CUDA版本不匹配
- 创建训练作业提示错误码ModelArts.2763
- 训练作业日志中提示 “AttributeError: module '***' has no attribute '***'”
- 系统容器异常退出
- 硬盘限制故障
- 外网访问限制
- 权限问题
- GPU相关问题
-
业务代码问题
- 日志提示“pandas.errors.ParserError: Error tokenizing data. C error: Expected .* fields”
- 日志提示“max_pool2d_with_indices_out_cuda_frame failed with error code 0”
- 训练作业失败,返回错误码139
- 训练作业失败,如何使用开发环境调试训练代码?
- 日志提示“ '(slice(0, 13184, None), slice(None, None, None))' is an invalid key”
- 日志报错“DataFrame.dtypes for data must be int, float or bool”
- 日志提示“CUDNN_STATUS_NOT_SUPPORTED. ”
- 日志提示“Out of bounds nanosecond timestamp”
- 日志提示“Unexpected keyword argument passed to optimizer”
- 日志提示“no socket interface found”
- 日志提示“Runtimeerror: Dataloader worker (pid 46212 ) is killed by signal: Killed BP”
- 日志提示“AttributeError: 'NoneType' object has no attribute 'dtype'”
- 日志提示“No module name 'unidecode'”
- 分布式Tensorflow无法使用“tf.variable”
- MXNet创建kvstore时程序被阻塞,无报错
- 日志出现ECC错误,导致训练作业失败
- 超过最大递归深度导致训练作业失败
- 使用预置算法训练时,训练失败,报“bndbox”错误
- 训练作业进程异常退出
- 训练作业进程被kill
- 预置算法运行故障
- 训练作业运行失败
- 专属资源池创建训练作业
- 训练作业性能问题
- Ascend相关问题
-
推理部署
-
模型管理
- 创建模型失败,如何定位和处理问题?
- 导入模型提示该账号受限或者没有操作权限
- 用户创建模型时构建镜像或导入文件失败
- 创建模型时,OBS文件目录对应镜像里面的目录结构是什么样的?
- 通过OBS导入模型时,如何编写打印日志代码才能在ModelArts日志查询界面看到日志
- 通过OBS创建模型时,构建日志中提示pip下载包失败
- 通过自定义镜像创建模型失败
- 导入模型后部署服务,提示磁盘不足
- 创建模型成功后,部署服务报错,如何排查代码问题
- 自定义镜像导入配置运行时依赖无效
- 通过API接口查询模型详情,model_name返回值出现乱码
- 导入模型提示模型或镜像大小超过限制
- 导入模型提示单个模型文件超过5G限制
- 订阅的模型一直处于等待同步状态
- 创建模型失败,提示模型镜像构建任务超时,没有构建日志
-
服务部署
- 自定义镜像模型部署为在线服务时出现异常
- 部署的在线服务状态为告警
- 服务启动失败
- 服务部署、启动、升级和修改时,拉取镜像失败如何处理?
- 服务部署、启动、升级和修改时,镜像不断重启如何处理?
- 服务部署、启动、升级和修改时,容器健康检查失败如何处理?
- 服务部署、启动、升级和修改时,资源不足如何处理?
- 模型使用CV2包部署在线服务报错
- 服务状态一直处于“部署中”
- 服务启动后,状态断断续续处于“告警中”
- 服务部署失败,报错No Module named XXX
- IEF节点边缘服务部署失败
- 批量服务输入/输出obs目录不存在或者权限不足
- 部署在线服务出现报错No CUDA runtime is found
- 使用AI市场物体检测YOLOv3_Darknet53算法训练后部署在线服务报错
- 使用预置AI算法部署在线服务报错gunicorn:error:unrecorgized arguments
- 内存不足如何处理?
- 服务预测
-
模型管理
- MoXing
- API/SDK
- 资源池
-
Lite Server
- GPU裸金属服务器使用EulerOS内核误升级如何解决
- GPU A系列裸金属服务器无法获取显卡如何解决
- GPU裸金属服务器无法Ping通如何解决
- GPU A系列裸金属服务器RoCE带宽不足如何解决?
- GPU裸金属服务器更换NVIDIA驱动后执行nvidia-smi提示Failed to initialize NVML
- 训练速度突然下降以及执行nvidia-smi卡顿如何解决?
- GP Vnt1裸金属服务器用PyTorch报错CUDA initialization:CUDA unknown error
- 使用SFS盘出现报错rpc_check_timeout:939 callbacks suppressed
- 华为云CCE集群纳管GPU裸金属服务器由于CloudInit导致纳管失败的解决方案
- GPU A系列裸金属服务器使用CUDA cudaGetDeviceCount()提示CUDA initializat失败
- 裸金属服务器Euler OS升级NetworkManager-config-server导致SSH链接故障解决方案
- Lite Cluster
-
常见问题
- 权限相关
- 存储相关
- Standard自动学习
- Standard Workflow
-
Standard数据准备
- 在ModelArts数据集中添加图片对图片大小有限制吗?
- 如何将本地标注的数据导入ModelArts?
- 在ModelArts中数据标注完成后,标注结果存储在哪里?
- 在ModelArts中如何将标注结果下载至本地?
- 在ModelArts中进行团队标注时,为什么团队成员收不到邮件?
- ModelArts团队标注的数据分配机制是什么?
- 如何将两个ModelArts数据集合并?
- 在ModelArts中同一个账户,图片展示角度不同是为什么?
- 在ModelArts中智能标注完成后新加入数据需要重新训练吗?
- 在ModelArts中如何将图片划分到验证集或者训练集?
- 在ModelArts中物体检测标注时能否自定义标签?
- ModelArts数据集新建的版本找不到怎么办?
- 如何切分ModelArts数据集?
- 如何删除ModelArts数据集中的图片?
-
Standard Notebook
- ModelArts的Notebook是否支持Keras引擎?
- 如何在ModelArts的Notebook中上传下载OBS文件?
- ModelArts的Notebook实例upload后,数据会上传到哪里?
- 在ModelArts中如何将Notebook A的数据复制到Notebook B中?
- 在ModelArts的Notebook中如何对OBS的文件重命名?
- 在ModelArts的Notebook中如何使用pandas库处理OBS桶中的数据?
- 在ModelArts的Notebook中,如何访问其他账号的OBS桶?
- 在ModelArts的Notebook中JupyterLab默认工作路径是什么?
- 如何查看ModelArts的Notebook使用的cuda版本?
- 在ModelArts的Notebook中如何获取本机外网IP?
- ModelArts的Notebook有代理吗?如何关闭?
- 在ModelArts的Notebook中内置引擎不满足使用需要时,如何自定义引擎IPython Kernel?
- 在ModelArts的Notebook中如何将git clone的py文件变为ipynb文件?
- 在ModelArts的Notebook实例重启时,数据集会丢失吗?
- 在ModelArts的Notebook的Jupyterlab可以安装插件吗?
- 在ModelArts的Notebook的CodeLab中能否使用昇腾卡进行训练?
- 如何在ModelArts的Notebook的CodeLab上安装依赖?
- 在ModelArts的Notebook中安装远端插件时不稳定要怎么办?
- 在ModelArts的Notebook中实例重新启动后要怎么连接?
- 在ModelArts的Notebook中使用VS Code调试代码无法进入源码怎么办?
- 在ModelArts的Notebook中使用VS Code如何查看远端日志?
- 在ModelArts的Notebook中如何打开VS Code的配置文件settings.json?
- 在ModelArts的Notebook中如何设置VS Code背景色为豆沙绿?
- 在ModelArts的Notebook中如何设置VS Code远端默认安装的插件?
- 在ModelArts的VS Code中如何把本地插件安装到远端或把远端插件安装到本地?
- 在ModelArts的Notebook中,如何使用昇腾多卡进行调试?
- 在ModelArts的Notebook中使用不同的资源规格训练时为什么训练速度差不多?
- 在ModelArts的Notebook中使用MoXing时,如何进行增量训练?
- 在ModelArts的Notebook中如何查看GPU使用情况?
- 在ModelArts的Notebook中如何在代码中打印GPU使用信息?
- 在ModelArts的Notebook中JupyterLab的目录、Terminal的文件和OBS的文件之间的关系是什么?
- 如何在ModelArts的Notebook实例中使用ModelArts数据集?
- pip介绍及常用命令
- 在ModelArts的Notebook中不同规格资源/cache目录的大小是多少?
- 资源超分对在ModelArts的Notebook实例有什么影响?
- 如何在Notebook中安装外部库?
- 在ModelArts的Notebook中,访问外网速度不稳定怎么办?
-
Standard模型训练
- 在ModelArts训练得到的模型欠拟合怎么办?
- 在ModelArts中训练好后的模型如何获取?
- 在ModelArts上如何获得RANK_TABLE_FILE用于分布式训练?
- 在ModelArts上训练模型如何配置输入输出数据?
- 在ModelArts上如何提升训练效率并减少与OBS的交互?
- 在ModelArts中使用Moxing复制数据时如何定义路径变量?
- 在ModelArts上如何创建引用第三方依赖包的训练作业?
- 在ModelArts训练时如何安装C++的依赖库?
- 在ModelArts训练作业中如何判断文件夹是否复制完毕?
- 如何在ModelArts训练作业中加载部分训练好的参数?
- ModelArts训练时使用os.system('cd xxx')无法进入文件夹怎么办?
- 在ModelArts训练代码中,如何获取依赖文件所在的路径?
- 自如何获取ModelArts训练容器中的文件实际路径?
- ModelArts训练中不同规格资源“/cache”目录的大小是多少?
- ModelArts训练作业为什么存在/work和/ma-user两种超参目录?
- 如何查看ModelArts训练作业资源占用情况?
- 如何将在ModelArts中训练好的模型下载或迁移到其他账号?
-
Standard推理部署
- 如何将Keras的.h5格式的模型导入到ModelArts中?
- ModelArts导入模型时,如何编写模型配置文件中的安装包依赖参数?
- 在ModelArts中使用自定义镜像创建在线服务,如何修改端口?
- ModelArts平台是否支持多模型导入?
- 在ModelArts中导入模型对于镜像大小有什么限制?
- ModelArts在线服务和批量服务有什么区别?
- ModelArts在线服务和边缘服务有什么区别?
- 在ModelArts中部署模型时,为什么无法选择Ascend Snt3资源?
- ModelArts线上训练得到的模型是否支持离线部署在本地?
- ModelArts在线服务预测请求体大小限制是多少?
- ModelArts部署在线服务时,如何避免自定义预测脚本python依赖包出现冲突?
- ModelArts在线服务预测时,如何提高预测速度?
- 在ModelArts中调整模型后,部署新版本模型能否保持原API接口不变?
- ModelArts在线服务的API接口组成规则是什么?
- ModelArts在线服务处于运行中时,如何填写request header和request body?
-
Standard镜像相关
- 不在同一个主账号下,如何使用他人的自定义镜像创建Notebook?
- 如何登录并上传镜像到SWR?
- 在Dockerfile中如何给镜像设置环境变量?
- 如何通过docker镜像启动容器?
- 如何在ModelArts的Notebook中配置Conda源?
- ModelArts的自定义镜像软件版本匹配有哪些注意事项?
- 镜像在SWR上显示只有13G,安装少量的包,然后镜像保存过程会提示超过35G大小保存失败,为什么?
- 如何保证自定义镜像能不因为超过35G而保存失败?
- 如何减小本地或ECS构建镜像的目的镜像的大小?
- 镜像过大,卸载原来的包重新打包镜像,最终镜像会变小吗?
- 在ModelArts镜像管理注册镜像报错ModelArts.6787怎么处理?
- 用户如何设置默认的kernel?
- Standard专属资源池
- Studio
- Edge
- API/SDK
- Lite Server
- Lite Cluster
- 历史文档待下线
- 视频帮助
- 文档下载
- 通用参考
文档首页/
AI开发平台ModelArts/
最佳实践/
DeepSeek系列模型推理/
DeepSeek模型基于ModelArts Lite Server适配MindIE推理部署指导/
部署推理服务/
自动化脚本快速部署推理服务(推荐)
链接复制成功!
自动化脚本快速部署推理服务(推荐)
场景描述
本方案提供了一键式安装脚本start.sh,用于快速部署推理服务。脚本中实现了以下步骤的自动化操作:
- 环境检查
- 拉取镜像
- 根据实际值更新rank_table_file.json
- 启动容器
- 进入容器启动服务
前提条件
- 已经完成资源购买。
- 请确保多机之间能够正常通信。
- 请确保每台机器都能访问到西南-贵阳一SWR镜像仓库。
约束限制
脚本中的镜像是在西南-贵阳一区域,建议在西南-贵阳一区域上部署推理服务。
脚本默认只支持在标准的欧拉或HCE 2.0操作系统上执行。
步骤一:检查环境
- SSH登录机器后,检查NPU设备检查。如果驱动版本不是24.1.0,请先升级驱动和对应固件。
npu-smi info -t board -i 1 | egrep -i "software|firmware" #查看驱动和固件版本
24.1.0版本驱动文件为Ascend-hdk-910b-npu-driver_24.1.0_linux-aarch64.run,对应固件文件为Ascend-hdk-910b-npu-firmware_7.5.0.3.220.run,请申请下载。
安装固件命令如下,安装完后需要reboot重启机器。
chmod 700 *.run ./Ascend-hdk-910b-npu-firmware_7.5.0.3.220.run --full reboot
安装24.1.0驱动命令如下:
./Ascend-hdk-910b-npu-driver_24.1.0_linux-aarch64.run --full --install-for-all
安装完成后再使用如下命令查看是否安装正确。
npu-smi info -t board -i 1 | egrep -i "software|firmware"
- 检查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
步骤二:自动化部署
- 需要先安装yum和expect。
sudo apt-get install yum yum install expect
- 把rank_table_file.json、start.sh和权重文件放在同一目录下。其中rank_table_file.json和start.sh只需要在主节点即可。rank_table_file.json仅作为模板使用,会在start.sh脚本里自动更新,文件内容详见附录:rank_table_file.json文件和一键部署脚本start.sh。参考目录结构如下:
${mountPath} |---rank_table_file.json |---start.sh |---DeepSeekR1-w8a8 # 权重文件所在目录,每个节点都要有,且目录结构保持一致
- 执行部署脚本start.sh。
sh start.sh --model_name ${modelName} --mount_path ${mountPath} --maxSeqLen ${maxSeqLen} --node_ips ${nodeIps} --passwords ${nodePwds}
- modelName:模型权重所在文件夹名称。注意:文件夹名称需要包含R1或V3。例如:DeepSeekR1-w8a8。
- mountPath:容器挂载的路径,且不能为/home,该路径下包含权重文件所在目录。即为权重文件所在目录的父目录。
- maxSeqLen:输入长度+输出长度的最大值。推荐默认16384。
- nodeIps:节点IP列表,使用“,“分隔。填2个节点IP地址。
- nodePwds:各节点的root用户登录密码,使用“,“分隔,和上述节点要一一对应。
步骤三:调用
执行请求调用模型
curl -ik -H 'Content-Type: application/json' -d '{"messages":[{"role":"user","content":"请讲一个笑话"}],"model":"${model_name}","temperature":0.6,"max_tokens":1024}' -X POST http://${ip}:${port}/v1/chat/completions
- model_name:为要调用的模型名称,即DeepSeek-V3或DeepSeek-R1
- ip:为步骤二:自动化部署中nodeIps中第一个IP
- port:为要访问的端口,默认1025
一键部署脚本start.sh
#!/bin/bash # 定义默认值 # 参数变量 model_name="" mount_path="" maxSeqLen= image_name="swr.cn-southwest-2.myhuaweicloud.com/ei_ascendcloud_devops/mindie:2.0.T3.1-800I-A2-py311-openeuler24.03-lts-0220" CONTAINER_NAME="mindie" # 根据变量修改的值 MODEL_NAME="" model_path="" mount_path="${mount_path%/}" RANK_TABLE_FILE="$mount_path/rank_table_file.json" port=22 # 默认maxSeqLen为16K时的参数配置,如果maxSeqLen修改为32K时,需要修改maxInputTokenLen、maxPrefillTokens和maxIterTimes的值,具体修改方法参见附录:config.json文件介绍。 maxPrefillBatchSize=100 maxInputTokenLen=8192 maxPrefillTokens=8192 maxIterTimes=8192 httpsEnabled=false multiNodesInferEnabled=true interCommTLSEnabled=false interNodeTLSEnabled=false # 定义期望的软件和固件版本 expected_software_version="24.1.0" expected_firmware_version="7.5.0.3.220" # 定义节点IP列表(第一个IP为主节点) node_ips=("") NODE_IPS="" echo "node_ips: ${node_ips[*]}" # 定义密码列表(如果只有一个密码,则所有节点使用该密码) # node_passwords=("xxx" "xxx") # 替换为实际密码 node_passwords=("") # 检查expect是否安装 if ! command -v expect &> /dev/null; then echo "错误: expect未安装,请先执行yum install expect" exit 1 fi # 解析命令行参数 ARGS=$(getopt -o n:p:l:i:k: -l model_name:,mount_path:,maxSeqLen:,node_ips:,passwords: -- "$@") if [ $? -ne 0 ]; then echo "参数解析失败" exit 1 fi eval set -- "$ARGS" while true; do case "$1" in -n|--model_name) model_name=$2 # 忽略大小写 MODEL_NAME=$model_name shift 2 ;; -p|--mount_path) mount_path="$2" # 去除 mount_path 最后的 '/' mount_path="${mount_path%/}" shift 2 ;; -l|--maxSeqLen) maxSeqLen="$2" shift 2 ;; -i|--node_ips) IFS=',' read -r -a node_ips <<< "$2" shift 2 ;; -k|--passwords) IFS=',' read -r -a node_passwords <<< "$2" shift 2 ;; --) shift break ;; *) echo "用法:$0 -n <model_name> -p <mount_path> -l <maxSeqLen> -i <node_ips> -k <passwords>" echo " -n, --model-name: 模型名称,可选值为 r1 或 v3" echo " -p, --mount-path: 挂载路径,必须提供,且不能为 /home" echo " -l, --max-seq-len: 输入长度+输出长度的最大值,需要在8192上加2^的若干次方数" echo " -i, --node-ips: 逗号分隔的节点IP地址" echo " -k, --passwords: 密码字符串列表" exit 1 ;; esac done # 检查 mount_path 是否为空或为 /home if [ -z "$mount_path" ]; then echo "必须提供 mount_path 参数" exit 1 fi if [ "$mount_path" = "/home" ]; then echo "mount_path 不能为 /home" exit 1 fi if [ -z "$maxSeqLen" ]; then echo "必须提供 maxSeqLen 参数" exit 1 fi model_path=$mount_path/$model_name # 转换 model_name 为小写,以便忽略大小写 lower_model_name=$(echo "$model_name" | tr '[:upper:]' '[:lower:]') # 检查 model_name 是否包含 r1 或 v3 if [[ "$lower_model_name" == *"r1"* ]]; then model_name="DeepSeek-R1" # model_path=$mount_path/deepseekR1-w8a8 # echo "模型路径为:$model_path" elif [[ "$lower_model_name" == *"v3"* ]]; then model_name="DeepSeek-V3" # model_path=$mount_path/deepseekV3-w8a8 # echo "模型路径为:$model_path" else echo "错误: model_name 参数中必须包含 r1 或 v3" exit 1 fi RANK_TABLE_FILE="$mount_path/rank_table_file.json" # 打印参数值 echo "maxSeqLen的值为:$maxSeqLen" echo "模型名:$model_name" echo "模型路径:$model_path" echo "挂载路径:$mount_path" echo "node_ips: ${node_ips[*]}" # 将数组元素以空格连接成字符串,再使用tr将空格替换为逗号 NODE_IPS=$(printf "%s " "${node_ips[@]}" | tr ' ' ',') # 去除末尾多余的逗号 NODE_IPS=${NODE_IPS%,} echo "NODE_IPS: ${NODE_IPS}" echo "node_passwords: ${node_passwords[*]}" echo "rank_table_file文件路径:$RANK_TABLE_FILE" # exit 0 echo "步骤1: 检查NPU的软件和固件信息..." npu_smi_output=$(npu-smi info -t board -i 1 | egrep -i "software|firmware") if [ $? -ne 0 ]; then echo "检查NPU软件和固件信息失败,退出脚本。" exit 1 fi # 提取实际的软件和固件版本 actual_software_version=$(echo "$npu_smi_output" | grep -i "Software Version" | awk -F': ' '{print $2}' | tr -d ' ') actual_firmware_version=$(echo "$npu_smi_output" | grep -i "Firmware Version" | awk -F': ' '{print $2}' | tr -d ' ') # 比较软件版本 if echo -e "$actual_software_version\n$expected_software_version" | sort -V | head -n1 | grep -q "$actual_software_version"; then if [ "$actual_software_version" != "$expected_software_version" ]; then echo "软件版本不对,期望版本至少为 $expected_software_version,实际版本为 $actual_software_version" exit 1 fi fi # 比较固件版本 if echo -e "$actual_firmware_version\n$expected_firmware_version" | sort -V | head -n1 | grep -q "$actual_firmware_version"; then if [ "$actual_firmware_version" != "$expected_firmware_version" ]; then echo "固件版本不对,期望版本至少为 $expected_firmware_version,实际版本为 $actual_firmware_version" exit 1 fi fi echo "NPU软件和固件版本检查通过。" # 步骤2: 执行一系列检查命令,如果有报错则退出 echo "步骤2: 执行检查命令..." commands=( "for i in {0..7}; do hccn_tool -i \$i -lldp -g | grep Ifname; done" "for i in {0..7}; do hccn_tool -i \$i -link -g ; done" "for i in {0..7}; do hccn_tool -i \$i -net_health -g ; done" "for i in {0..7}; do hccn_tool -i \$i -netdetect -g ; done" "for i in {0..7}; do hccn_tool -i \$i -gateway -g ; done" "for i in {0..7}; do hccn_tool -i \$i -tls -g ; done | grep switch" "for i in {0..7}; do hccn_tool -i \$i -tls -s enable 0; done" ) echo "拉取镜像" docker pull $image_name # 步骤4: 获取enp67s0f5网卡下的IP地址 echo "步骤4: 获取本机IP地址..." ip_addr_now=$(hostname -I | awk '{print $1}') if [ -z "$ip_addr_now" ]; then echo "获取当前物理机IP地址失败。" exit 1 fi echo "获取当前物理机IP地址成功,IP地址为: $ip_addr_now" # 初始化标记位 is_first_node=false echo "主节点ip地址为:${node_ips[0]}" # exit 0 # 判断 ip_addr_now 是否是第一个节点 if [ "$ip_addr_now" = "${node_ips[0]}" ]; then is_first_node=true fi if $is_first_node; then echo "${ip_addr_now}作为主节点" # 步骤3: 获取每张卡的IP地址并打印(修正版) echo "步骤3: 获取每张卡的IP地址..." # 获取主节点的显卡IP echo "步骤3: 获取主节点的显卡IP..." declare -a main_npu_ips for i in {0..7}; do ip_info=$(hccn_tool -i $i -ip -g 2>&1) if [ $? -ne 0 ]; then echo "获取卡号 $i 的IP地址失败,退出脚本。" exit 1 fi ip_addr=$(echo "$ip_info" | awk -F':' '/ipaddr/ {print $2}' | tr -d ' ') if [ -z "$ip_addr" ]; then echo "卡号 $i 未找到有效IP地址,退出脚本。" exit 1 fi main_npu_ips[$i]=$ip_addr echo "主节点NPU卡$i IP地址: ${main_npu_ips[$i]}" done echo "主节点IP地址获取完成。" # 备份原始文件 cp "$RANK_TABLE_FILE" "${RANK_TABLE_FILE}.bak" # 设置环境变量传递显卡IP export ips_0="${main_npu_ips[@]}" # 更新主节点的server_id和container_ip (使用Python) python3 <<EOF import json import os def update_json(filename, server_id, container_ip): device_ips = os.getenv("ips_0").split() with open(filename, 'r') as f: data = json.load(f) # 更新主节点的server_id和container_ip data['server_list'][0]['server_id'] = server_id data['server_list'][0]['container_ip'] = container_ip # 更新主节点的device_ip for i in range(8): if i < len(device_ips): data['server_list'][0]['device'][i]['device_ip'] = device_ips[i] else: data['server_list'][0]['device'][i]['device_ip'] = "" # 删除多余的设备条目(如果有的话) for server in data['server_list']: if len(server['device']) > 8: server['device'] = server['device'][:8] with open(filename, 'w') as f: json.dump(data, f, indent=4) update_json("$RANK_TABLE_FILE", "${node_ips[0]}", "${node_ips[0]}") EOF # 远程登录其他节点,获取显卡IP并更新rank_table_file.json for (( node_index=1; node_index<${#node_ips[@]}; node_index++ )); do node_ip=${node_ips[$node_index]} node_password=${node_passwords[$node_index]} echo "步骤3: 获取节点 $node_ip 的显卡IP..." # 使用expect远程执行命令获取显卡IP declare -a remote_npu_ips for i in {0..7}; do ip_info=$(expect -c " set timeout 10 spawn ssh -p $port -o StrictHostKeyChecking=no root@$node_ip \"hccn_tool -i $i -ip -g\" expect { \"password:\" { send \"${node_password}\r\" exp_continue } eof { catch wait result exit [lindex \$result 3] } } ") if [ $? -ne 0 ]; then echo "获取节点 $node_ip 卡号 $i 的IP地址失败,退出脚本。" exit 1 fi ip_addr=$(echo "$ip_info" | awk -F':' '/ipaddr/ {print $2}' | tr -d ' ') if [ -z "$ip_addr" ]; then echo "节点 $node_ip 卡号 $i 未找到有效IP地址,退出脚本。" exit 1 fi remote_npu_ips[$i]=$ip_addr echo "节点 $node_ip NPU卡$i IP地址: ${remote_npu_ips[$i]}" done echo "节点 $node_ip IP地址获取完成。" # 设置环境变量传递显卡IP export ips_1="${remote_npu_ips[@]}" # 更新当前节点的server_id和container_ip python3 <<EOF import json import os def update_server_info(filename, server_index, server_id, container_ip): device_ips = os.getenv("ips_1").split() with open(filename, 'r') as f: data = json.load(f) # 确保 server_list 有足够的条目 while server_index >= len(data['server_list']): new_server = { "device": [ {"device_id": str(i), "device_ip": "", "rank_id": str(len(data['server_list']) * 8 + i)} for i in range(8) ], "server_id": "", "container_ip": "" } data['server_list'].append(new_server) # 更新指定服务器的信息 data['server_list'][server_index]['server_id'] = server_id data['server_list'][server_index]['container_ip'] = container_ip # 更新设备 IP 和 rank_id for i in range(min(len(device_ips), 8)): data['server_list'][server_index]['device'][i]['device_ip'] = device_ips[i] data['server_list'][server_index]['device'][i]['rank_id'] = str(server_index * 8 + i) # 确保设备条目数量正确 data['server_list'][server_index]['device'] = data['server_list'][server_index]['device'][:8] # 更新 server_count data['server_count'] = str(len(data['server_list'])) with open(filename, 'w') as f: json.dump(data, f, indent=4) update_server_info("$RANK_TABLE_FILE", $node_index, "$node_ip", "$node_ip") EOF done # 传输给子节点 # 传输 rank_table_file.json 到其他节点 for (( node_index=1; node_index<${#node_ips[@]}; node_index++ )); do node_ip=${node_ips[$node_index]} node_password=${node_passwords[$node_index]} echo "传输 rank_table_file.json 到节点 $node_ip..." # 使用 expect 自动输入密码并执行 scp expect -c " set timeout 10 spawn scp -P $port -ro StrictHostKeyChecking=no $mount_path/rank_table_file.json $mount_path/start.sh root@$node_ip:$mount_path expect { \"password:\" { send \"$node_password\r\" exp_continue } eof { catch wait result exit [lindex \$result 3] } } " if [ $? -eq 0 ]; then echo "文件传输到节点 $node_ip 成功。" else echo "文件传输到节点 $node_ip 失败。" exit 1 fi done echo "所有文件传输完成。" # 连接到远程节点并执行命令 for (( node_index=1; node_index<${#node_ips[@]}; node_index++ )); do node_ip=${node_ips[$node_index]} node_password=${node_passwords[$node_index]} echo "连接到节点 $node_ip 并执行命令..." expect -c " set timeout 10 spawn ssh -p $port -o StrictHostKeyChecking=no root@$node_ip \"bash $mount_path/start.sh -n $MODEL_NAME -p $mount_path -l $maxSeqLen -i $NODE_IPS > $mount_path/log_$node_ip.txt 2>&1\" expect { \"password:\" { send \"$node_password\r\" exp_continue } eof { catch wait result exit [lindex \$result 3] } } " if [ $? -eq 0 ]; then echo "命令在节点 $node_ip 执行成功。" else echo "命令在节点 $node_ip 执行失败。" exit 1 fi done echo "远程执行脚本成功" sleep 32 fi # 步骤5: 启动容器 echo "步骤5: 启动容器..." # 启动容器 docker run -itd --privileged \ -v /etc/localtime:/etc/localtime \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /usr/local/Ascend/firmware:/usr/local/Ascend/firmware \ --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 $mount_path:$mount_path \ --net=host \ --ipc=host \ --shm-size 2g \ --name ${CONTAINER_NAME} \ ${image_name} \ /bin/bash # 检查容器是否启动成功 if [ $? -eq 0 ]; then echo "容器启动成功,容器名:${CONTAINER_NAME}" else echo "容器启动失败!" exit 1 fi # exit 0 # 步骤6: 将命令写入 ~/.bashrc 文件并执行 echo "步骤6: 将命令写入 ~/.bashrc 文件并执行..." # 定义需要写入的命令列表(直接使用宿主机变量) commands_to_write=( "cd /usr/local/Ascend/mindie/latest" "chmod 750 mindie-service" "chmod -R 550 mindie-service/bin" "chmod -R 500 mindie-service/bin/mindie_llm_backend_connector" "chmod 550 mindie-service/lib" "chmod 440 mindie-service/lib/*" "chmod 550 mindie-service/lib/grpc" "chmod 440 mindie-service/lib/grpc/*" "chmod -R 550 mindie-service/include" "chmod -R 550 mindie-service/scripts" "chmod 750 mindie-service/logs" "chmod 750 mindie-service/conf" "chmod 640 mindie-service/conf/config.json" "chmod 700 mindie-service/security" "chmod -R 700 mindie-service/security/*" "source /usr/local/Ascend/ascend-toolkit/set_env.sh" "source /usr/local/Ascend/nnal/atb/set_env.sh" "source /usr/local/Ascend/atb-models/set_env.sh" "unset HCCL_OP_EXPANSION_MODE" "export ATB_LLM_HCCL_ENABLE=1" "export ATB_LLM_COMM_BACKEND=\"hccl\"" "export PYTORCH_NPU_ALLOC_CONF=\"expandable_segments:True\"" "export MIES_CONTAINER_IP=${ip_addr_now}" "export RANKTABLEFILE=$mount_path/rank_table_file.json" "export HCCL_DETERMINISTIC=false" "export PARALLEL_PARAMS=\"[1,16,1,16,-1,-1]\"" "export ATB_WORKSPACE_MEM_ALLOC_ALG_TYPE=3" "export ATB_WORKSPACE_MEM_ALLOC_GLOBAL=1" "export NPU_MEMORY_FRACTION=0.96" "export HCCL_CONNECT_TIMEOUT=7200" "export HCCL_EXEC_TIMEOUT=0" # "export MINDIE_LOG_TO_STDOUT=1" ) # 将命令列表转换为单行字符串(避免引号嵌套问题) commands_str=$(printf "%s\n" "${commands_to_write[@]}") # 在容器内执行命令(使用单引号包裹) docker exec ${CONTAINER_NAME} bash -c ' # 逐行处理命令 while IFS= read -r cmd; do # 检查命令是否已存在 if ! grep -Fxq "$cmd" ~/.bashrc; then echo "$cmd" >> ~/.bashrc fi done <<< "$1" # 使配置生效 # source ~/.bashrc ' _ "${commands_str}" # 通过参数传递命令列表 # 检查命令是否执行成功 if [ $? -eq 0 ]; then echo "命令已成功写入 ~/.bashrc 并执行。" else echo "命令写入或执行失败!" echo "删除容器${CONTAINER_NAME}" docker stop ${CONTAINER_NAME} && docker rm ${CONTAINER_NAME} echo "删除成功" exit 1 fi # 容器内执行命令 echo "环境变量设置的当前节点ip为:" docker exec ${CONTAINER_NAME} bash -c 'source ~/.bashrc && echo $MIES_CONTAINER_IP' docker exec ${CONTAINER_NAME} bash -c "cat $RANK_TABLE_FILE" docker exec ${CONTAINER_NAME} bash -c " cd /usr/local/Ascend/mindie/latest/mindie-service/conf && \ sed -i 's|\"ipAddress\" : \".*\"|\"ipAddress\" : \"${node_ips[0]}\"|g' config.json && \ sed -i 's|\"managementIpAddress\" : \".*\"|\"managementIpAddress\" : \"${node_ips[0]}\"|g' config.json && \ sed -i 's|\"modelName\" : \".*\"|\"modelName\" : \"${model_name}\"|g' config.json && \ sed -i 's|\"modelWeightPath\" : \".*\"|\"modelWeightPath\" : \"${model_path}\"|g' config.json && \ sed -i 's|\"maxPrefillBatchSize\" : .*|\"maxPrefillBatchSize\" : ${maxPrefillBatchSize},|g' config.json && \ sed -i 's|\"maxSeqLen\" : .*|\"maxSeqLen\" : ${maxSeqLen},|g' config.json && \ sed -i 's|\"maxInputTokenLen\" : .*|\"maxInputTokenLen\" : ${maxInputTokenLen},|g' config.json && \ sed -i 's|\"maxPrefillTokens\" : .*|\"maxPrefillTokens\" : ${maxPrefillTokens},|g' config.json && \ sed -i 's|\"httpsEnabled\" : .*|\"httpsEnabled\" : ${httpsEnabled},|g' config.json && \ sed -i 's|\"multiNodesInferEnabled\" : .*|\"multiNodesInferEnabled\" : ${multiNodesInferEnabled},|g' config.json && \ sed -i 's|\"interCommTLSEnabled\" : .*|\"interCommTLSEnabled\" : ${interCommTLSEnabled},|g' config.json && \ sed -i 's|\"interNodeTLSEnabled\" : .*|\"interNodeTLSEnabled\" : ${interNodeTLSEnabled},|g' config.json && \ sed -i 's|\"maxIterTimes\" : .*|\"maxIterTimes\" : ${maxIterTimes},|g' config.json " # 检查修改后的结果 echo "修改后的值如下所示:" docker exec ${CONTAINER_NAME} bash -c "cd /usr/local/Ascend/mindie/latest/mindie-service/conf && cat config.json" docker exec ${CONTAINER_NAME} bash -c "source ~/.bashrc && rm -rf /root/mindie/cache/* && cd /usr/local/Ascend/mindie/latest/mindie-service && nohup ./bin/mindieservice_daemon &> $mount_path/start_log_$ip_addr_now.txt &" # 查看容器日志 echo "查看容器日志:" docker logs -f ${CONTAINER_NAME} echo "所有步骤执行完毕。"
父主题: 部署推理服务