华为云用户手册

  • 原因分析 出现该问题的可能原因如下: 本地数据、文件保存将"/cache"目录空间用完。 数据处理过程中对数据进行解压,导致数据大小膨胀,将"/cache"目录空间用完。 数据未保存至/cache目录或者/home/ma-user/目录(/cache会软连接成/home/ma-user/),导致数据占满系统目录。系统目录仅支持系统功能基本运行,无法支持大数据存储。 部分训练任务会在训练过程中生成checkpoint文件,并进行更新。如更新过程中,未删除历史的checkpoint文件,会导致/cache目录逐步被用完。 实际存储空间足够,却依旧报错“No Space left on device”。可能是inode不足,或者是触发操作系统的文件索引缓存问题,导致操作系统无法创建文件,造成用户磁盘占满。 触发条件和下面的因素有关: 文件名越长,文件数量的上限越小。 blocksize越小,文件数量的上限越小。 blocksize系统默认为4096B,总共有三种大小:1024B、2048B、4096B。 创建文件越快,越容易触发(机制大概是:有一个缓存,这块大小和上面的1和2有关,目录下文件数量比较大时会启动,使用方式是边用边释放)。 程序运行过程中,产生了core文件,core文件占满了"/"根目录空间。
  • 处理方法 排查数据集大小、数据集解压后的大小,checkpoint保存文件大小,是否占满了磁盘空间。具体规格的空间大小可参见训练环境中不同规格资源“/cache”目录的大小 如数据大小已超过/cache目录大小,则可以考虑通过SFS来额外挂载数据盘进行扩容。 将数据和checkpoint保存在/cache目录或者/home/ma-user/目录。 检查checkpoint相关逻辑,保证历史checkpoint不会不断积压,导致/cache目录用完。 如文件大小小于/cache目录大小并且文件数量超过50w,则考虑为inode不足或者触发了操作系统的文件索引相关问题。需要: 分目录处理,减少单个目录文件量。 减慢创建文件的速度。如数据解压过程中,sleep 5s后再进行下一个数据的解压。 如果训练作业的工作目录下有core文件生成,可以在启动脚本最前面加上如下代码,来关闭core文件产生。并推荐先在开发环境中进行代码调试。 import os os.system("ulimit -c 0")
  • 处理方法 查看虚拟机所使用的存储空间,再查看回收站文件占用内存,根据实际删除回收站里不需要的大文件。 在Notebook实例详情页,查看实例的存储容量。 执行如下命令,排查虚拟机所使用的存储空间,一般接近存储容量,请排查回收站占用内存。 cd /home/ma-user/work du -h --max-depth 0 执行如下命令,排查回收站占用内存(回收站文件默认在/home/ma-user/work/.Trash-1000/files下)。 cd /home/ma-user/work/.Trash-1000/ du -ah 根据实际删除回收站不需要的大文件。(注:请谨慎操作,文件删除后不可恢复) rm {文件路径} 如果删除的文件夹或者文件中带有空格,需要给文件夹或文件加上单引号。如图示例: 执行如下命令,再次检查虚拟机所使用的存储空间。 cd /home/ma-user/work du -h --max-depth 0 如果Notebook实例的存储配置采用的是云硬盘EVS,可在Notebook详情页申请扩容磁盘。
  • APIG.0101 预测地址错误 当预测的地址有问题时,APIG(API网关)将拦截请求,报错“APIG.0101”:“The API does not exist or has not been published in the environment”,请到在线服务详情界面,“调用指南”页签中获取正确的API接口地址。 如果您在配置文件url中有定义路径,需要在API调用body体中调用路径后拼接自定义路径,例如:您定义url为“/predictions/poetry”,那么在API调用时路径为“{API接口地址}/predictions/poetry”。 图1 获取API接口地址
  • APIG.0301 鉴权失败 通过API进行服务预测,或者使用Token进行APP认证,需要获取正确的Token鉴权,当Token不合法时,APIG(API网关)拦截请求,报错“APIG.0301”:“Incorrect IAM authentication information: decrypt token fail”。请获取正确的token填入X-Auth-Token,进行预测。如何获取Token请参考获取IAM用户Token。
  • APIG.0201 请求体内容过大 请求体内容过大时,APIG(API网关)会拦截请求,报错“APIG.0201”:“Request entity too large”。请减少预测请求内容后重试。 当使用API调用地址预测时,请求体的大小限制是12MB,超过12MB时,请求会被拦截。 使用ModelArts console的预测页签进行的预测,由于console的网络链路的不同,要求请求体的大小不超过8MB。 图2 请求报错APIG.0201
  • 使用自定义镜像创建训练作业时,检查启动文件路径 以OBS路径“obs://obs-bucket/training-test/demo-code”为例,训练代码会被自动下载至训练容器的“${MA_JOB_DIR}/demo-code”目录中,demo-code为OBS存放代码路径的最后一级目录,可以根据实际修改。 使用自定义镜像创建训练作业时,在代码目录下载完成后,镜像的启动命令会被自动执行。启动命令的填写规范如下: 如果训练启动脚本用的是py文件,例如train.py,运行命令可以写为python ${MA_JOB_DIR}/demo-code/train.py。 如果训练启动脚本用的是sh文件,例如main.sh,运行命令可以写为bash ${MA_JOB_DIR}/demo-code/main.sh。 其中demo-code为OBS存放代码路径的最后一级目录,可以根据实际修改。
  • 检查报错的路径是否存在 由于用户本地开发的代码需要上传至ModelArts后台,训练代码中涉及到依赖文件的路径时,用户设置有误的场景较多。 推荐通用的解决方案:使用os接口得到依赖文件的绝对路径,避免报错。 示例: |---project_root #代码根目录 |---BootfileDirectory #启动文件所在的目录 |---bootfile.py #启动文件 |---otherfileDirectory #其他依赖文件所在的目录 |---otherfile.py #其他依赖文件 在启动文件中,建议用户参考以下方式获取依赖文件所在路径,即示例中的otherfile_path。 import os current_path = os.path.dirname(os.path.realpath(__file__)) # BootfileDirectory, 启动文件所在的目录 project_root = os.path.dirname(current_path) # 工程的根目录,对应ModelArts训练控制台上设置的代码目录 otherfile_path = os.path.join(project_root, "otherfileDirectory", "otherfile.py")
  • 原因分析 找不到训练输入数据路径,可能是报错的路径填写不正确。用户请按照以下思路进行逐步排查: 检查报错的路径是否为OBS路径 检查报错的路径是否存在 找不到启动文件,可能是训练作业启动命令的路径填写不正确,参考使用自定义镜像创建训练作业时,检查启动文件路径排查解决。 可能为多个进程或者worker读写同一个文件。如果使用了SFS,则考虑是否多个节点同时写同一个文件。分析代码中是否存在多进程写同一文件的情况。建议避免作业中存在多进程,多节点并发读写同一文件的情况。
  • 检查报错的路径是否为OBS路径 使用ModelArts时,用户数据需要存放在自己OBS桶中,但是训练代码运行过程中不能使用OBS路径读取数据。 原因: 训练作业创建成功后,由于在运行容器直连OBS服务进行训练性能很差,系统会自动下载训练数据至运行容器的本地路径。所以,在训练代码中直接使用OBS路径会报错。例如训练代码的OBS路径为obs://bucket-A/training/,训练代码会被自动下载至${MA_JOB_DIR}/training/。 假设训练代码的OBS目录为obs://bucket-A/XXX/{training-project}/,“{training-project}”是存放训练代码的文件夹名称。训练时会自动下载OBS中{training-project}目录下的数据到训练容器的本地路径$MA_JOB_DIR/{training-project}/。 如果报错路径为训练数据路径,需要在以下两个地方完成适配,具体适配方法请参考自定义算法适配章节的输入输出配置部分:
  • 处理方法 请您根据报错原因排查创建训练作业时指定的代码目录,即OBS桶的路径是否正确。有两种方法判断是否存在。 使用当前账户登录OBS管理控制台,去查找对应的OBS桶、文件夹、文件是否存在。 通过接口判断路径是否存在。在代码中执行如下命令,检查路径是否存在。 import moxing as mox mox.file.exists('obs://obs-test/ModelArts/examples/')
  • 原因分析及处理方法 服务预测报错ModelArts.4503有多种场景,常见场景如下: 通信出错 请求报错:{"error_code":"ModelArts.4503","error_msg":"Failed to respond due to backend service not found or failed to respond"} 基于高性能考虑,ModelArts会复用同模型服务的连接。根据tcp协议,连接的断开可以由该连接的client端发起,也可以由server端发起。断开连接需要经过四次握手,所以可能会存在作为服务端的模型服务侧发起断开连接,但是该连接正在被作为客户端的ModelArts使用,从而导致通信出错,返回此错误信息。 如果您使用的是自定义镜像导入的模型,请增大自定义镜像中所使用的web server的keep-alive的参数值,尽量避免由服务端发起关闭连接。如您使用的Gunicorn来作为web server,可以通过Gunicorn命令的--keep-alive参数来设置该值。其他方式导入的模型,服务内部已做处理。 协议错误 请求报错:{"error_code":"ModelArts.4503", "error_msg":"Failed to find backend service because SSL error in the backend service, please check the service is https"} 部署在线服务使用的模型是从容器镜像中导入时,容器调用接口协议填写错误,会导致此错误信息。 出于安全考虑,ModelArts提供的推理请求都是https请求,从容器镜像中选择导入模型时,ModelArts允许使用的镜像提供https或http服务,但必须在“容器调用接口”中明确指定该镜像使用的是https或http服务。如下图所示: 图1 容器调用接口 如果您在“容器调用接口”中选择的结果跟您镜像实际提供的结果不匹配,例如您在这里选择的是https,但镜像里面实际提供的是http,就会遇到上述错误。反之,如果您选择的是http,但镜像里面实际提供的是https,也会遇到类似错误。 您可以创建一个新的AI应用版本,选择正确的协议(http或者https),重新部署在线服务或更新已有在线服务。 请求预测时间过长 报错:{"error_code": "ModelArts.4503", "error_msg": "Backend service respond timeout, please confirm your service is able to process the request without timeout. "}及报错:{"error_code": "ModelArts.4503", "error_msg": "Failed to find backend service because response timed out, please confirm your service is able to process the request without timeout. "} 因APIG(API网关)限制,平台每次请求预测的时间不超过40秒。数据从平台发送到服务,服务预测推理,再将结果返回的时间不超过限制,可以成功返回预测结果。当服务预测的时间过长或者频繁预测导致服务接收不过来请求,即会出现该报错。 可以通过以下方式解决问题: 服务预测请求内容过大时,会因数据处理慢导致请求超时,优化预测代码,缩短预测时间。 推理速度与模型复杂度强相关,优化模型,缩短预测时间。 扩容实例数或者选择性能更好的“计算节点规格”,例如使用GPU资源代替CPU资源,提升服务处理能力。 服务出错 报错:{"error_code": "ModelArts.4503","error_msg": "Backend service respond timeout, please confirm your service is able to process the request without timeout. "} 服务日志输出: [2022-10-24 11:37:31 +0000] [897] [INFO] Booting worker with pid: 897 [2022-10-24 11:41:47 +0000] [1997] [INFO] Booting worker with pid: 1997 [2022-10-24 11:41:22 +0000] [1897] [INFO] Booting worker with pid: 1897 [2022-10-24 11:37:54 +0000] [997] [INFO] Booting worker with pid: 997 服务异常进程反复重启导致预测请求无法发送到服务实例。 可以通过以下方式解决问题: 缩小预测请求数量看是否问题还复现,如果不复现是因为负载过大导致服务进程退出,需要扩容实例数量或者提升规格。 推理代码本身存在错误,请排查推理代码解决。
  • 处理方法 如果是OBS相关错误。 OBS文件不存在。The specified key does not exist。 参考日志提示“errorMessage:The specified key does not exist”章节处理。 用户OBS权限不足。 参考 5.5.1 日志提示“reason:Forbidden”。 OBS限流。 参考5.1.1 OBS拷贝过程中提示“BrokenPipeError: Broken pipe”。 OBS其他问题。 请参考OBS服务端错误码或者采集request id后向OBS客服进行咨询。 如果是空间不足。 参考 常见的磁盘空间不足的问题和解决办法章节处理。
  • 处理方法 针对原因1,需要在代码中补充如下环境变量。 import os os.environ["NCCL_IB_TC"] = "128" os.environ["NCCL_IB_GID_INDEX"] = "3" os.environ["NCCL_IB_TIMEOUT"] = "22" 针对原因2,需要在代码中设置环境变量NCCL_SOCKET_IFNAME。 import os os.environ["NCCL_SOCKET_IFNAME"] = "eth0" 只有当用户的NCCL版本低于2.14时,才需要进行以上设置。
  • 处理方法 对挂载盘的数据加权限,可以改为与训练容器内相同的用户组(1000),假如/nas盘是挂载路径,执行如下代码。 chown -R 1000:1000 /nas 或者 chmod 777 -R /nas 如果是自定义镜像中拉取的.sh脚本没有执行权限,可以在自定义脚本启动前执行"chmod +x xxx.sh"添加可执行权限。 ModelArts控制台上创建训练作业自定义镜像入口,默认以1000 uid用户来启动v2容器镜像,将ma-user的uid从1102改为1000,改变方式如下(假若需要sudo权限,可取消sudoers行的注释): v1训练作业环境变量迁移v2说明: v1的DLS_TASK_NUMBER环境变量,可以使用v2的MA_NUM_HOSTS环境变量替换,即选择的训练节点数。 v1的DLS_TASK_INDEX环境变量,当前可以使用v2的VC_TASK_INDEX环境变量替换,下一步使用MA_TASK_INDEX替换,建议使用demo script中的方式获取,以保证兼容性。 v1的BATCH_CUSTOM0_HOSTS环境变量,可以使用v2的${MA_VJ_NAME}-${MA_TASK_NAME}-0.${MA_VJ_NAME}:6666替换。 一般而言,v1的BATCH_CUSTOM{N}_HOSTS环境变量,可以使用v2的${MA_VJ_NAME}-${MA_TASK_NAME}-{N}.${MA_VJ_NAME}:6666替换。 分析代码中是否存在并发读写同一文件的逻辑,如有则进行修改。 如用户使用多卡的作业,那么可能每张卡都会有同样的读写数据的代码,可参考如下代码修改。 import moxing as mox from mindspore.communication import init, get_rank, get_group_size init() rank_id = get_rank() # 仅让0号卡进行数据下载 if rank_id % 8 == 0: mox.file.copy_parallel('obs://bucket-name/dir1/dir2/', '/cache')
  • 问题现象 训练作业访问挂载的EFS,或者是执行.sh启动脚本时,出现如下错误: [Errno 13]Permission denied: '/xxx/xxxx' 图1 错误日志 bash: /bin/ln: Permission denied 自定义镜像中,bash:/home/ma-user/.pip/pip.conf:Permission Denied 自定义镜像中,tee: /xxx/xxxx: Permission denied cp: cannot stat '': No such file or directory
  • 原因分析 出现该问题的可能原因如下: [Errno 13]Permission denied: '/xxx/xxxx' 上传数据时文件所属与文件权限未修改,导致训练作业以work用户组访问时没有权限了。 在代码目录中的.sh拷贝到容器之后,需要添加“x”可执行权限。 bash: /bin/ln: Permission denied 因安全问题,不支持用户开通使用In命令。 bash:/home/ma-user/.pip/pip.conf:Permission Denied 因从V1切换到V2时,ma-user的uid仍是1102未改变导致。 tee: /xxx/xxxx: Permission denied cp: cannot stat '': No such file or directory 可能原因是用户使用的启动脚本为旧版本的run_train.sh,脚本里面有某些环境变量在新版本下发的作业中并不存在这些环境变量导致。 可能原因是使用Python file接口并发读写同一文件。
  • 处理方法 尽量代码里不要去修改CUDA_VISIBLE_DEVICES变量,用系统默认里面自带的。 如果必须指定卡ID,需要注意一下1/2/4规格下,指定的卡ID与实际分配的卡ID不匹配的情况。 如果上述方法还出现了错误,可以去notebook里面调试打印CUDA_VISIBLE_DEVICES变量,或者用以下代码测试一下,查看结果是否返回的是True。 import torch torch.cuda.is_available()
  • 在线服务的API接口组成规则是什么? AI应用部署成在线服务后,用户可以获取API接口用于访问推理。 API接口组成规则如下: https://域名/版本/infer/服务ID 示例如下: https://6ac81cdfac4f4a30be95xxxbb682.apig.xxx.xxx.com/v1/infers/468d146d-278a-4ca2-8830-0b6fb37d3b72 图1 API接口 父主题: 在线服务
  • 为什么资源充足还是在排队? 如果是公共资源池,一般是由于其他用户占用资源导致,请耐心等待或根据训练作业一直在等待中(排队)?方法降低排队时间。 如果是专属资源池,建议您进行以下排查: 排查专属资源池中是否存在其他作业(包括推理作业、训练作业、开发环境作业等)。 可通过总览页面,快速判断是否有其他模块的作业或实例在运行中,并进入到相关作业或实例上,判断是否使用了专属资源池。如判断相关作业或实例可停止,则可以停止,释放出更多的资源。 图1 总览 单击进入专属资源池详情页面,查看作业列表。 观察队头是否有其他作业在排队,如果已有作业在排队,则新建的作业需要继续等待。 图2 作业排队列表 如果通过排查计算,发现资源确实足够,则考虑可能由于资源碎片化导致的。 例如,集群共2个节点,每个节点都空闲了4张卡,总剩余卡数为8张卡,但用户的作业要求为1节点8张卡,因此无法调度上。 父主题: 一般性问题
  • 解决方法一 方法一:检查VS Code网络是否正常。在VS Code插件市场上搜索ModelArts-HuaweiCloud,若显示如下则网络异常,请切换代理或使用其他网络。 操作完成后再次执行搜索,若显示如下则网络正常,请回到ModelArts控制台界面再次单击界面上的“VS Code接入”按钮。 方法二:出现如下图报错,是由于VS Code版本过低,建议升级VS Code版本为1.57.1或者最新版。
  • 解决措施 一、Region等信息配置不正确 配置正确的Region、Projects、Endpoint信息。 例如:Endpoint配置不正确也会导致认证失败。 错误示例:Endpoint参数前面带了https,正确的配置中不需要有https。 图1 配置ToolKit 二、未配置hosts文件或者hosts文件信息配置不正确 在本地PC的hosts文件中配置域名和IP地址的对应关系。 三、网络代理设置 如果用户使用的网络有代理设置要求,请检查代理配置是否正确。也可以使用手机热点网络连接进行测试排查。 检查代理配置是否正确。 图2 PyCharm网络代理设置 四、AK/SK不正确 获取到的AK/SK信息不正确,请确认获取到正确的AK/SK信息再进行尝试,具体请参考创建访问密钥(AK和SK)。 五、电脑时间设置错误 请设置电脑时间为正确时间。
  • 服务部署失败,报错ModelArts.3520,服务总数超限 部署服务时,ModelArts报错“ModelArts.3520: 在线服务总数超限,限制为20”,接口返回“A maximum of xxx real-time services are allowed.”,表示服务数量超限。 正常情况下,单个用户最多可创建20个在线服务。可采取以下方式处理: 删除状态为“异常”的服务。 删除长期不使用的服务。 因业务原因需申请更大配额,可提工单申请扩容。 父主题: 在线服务
  • 原因分析 本地挂载目录是在Notebook容器的“~/data”目录下创建的demo-yf文件夹,而JupyterLab左侧导航默认路径为“~/work”目录,相当于/data和/work是同一层级,所以在JupyterLab中看不到。 打开Terminal后,默认为~work目录,执行如下命令进入~data目录查看本地挂载路径: (PyTorch-1.8) [ma-user work]$cd (PyTorch-1.8) [ma-user ~]$cd /data (PyTorch-1.8) [ma-user data]$ls
  • 解决方法 在VS Code中使用命令方式进行远程连接时,增加参数"-o StrictHostKeyChecking=no" ssh -tt -o StrictHostKeyChecking=no -i ${IdentityFile} ${User}@${HostName} -p ${Port} 参数说明: - IdentityFile:本地密钥路径 - User:用户名,例如:ma-user - HostName:IP地址 - Port:端口号 在VS Code中手工配置远程连接时,在本地的ssh config文件中增加配置参数“StrictHostKeyChecking no”和“UserKnownHostsFile=/dev/null” Host xxx HostName x.x.x.x #IP地址 Port 22522 User ma-user IdentityFile C:/Users/my.pem StrictHostKeyChecking no UserKnownHostsFile=/dev/null ForwardAgent yes 提示:增加参数后SSH登录时会忽略known_hosts文件,有安全风险。
  • 1个节点的专属资源池,能否部署多个服务? 支持。 在部署服务时,选择专属资源池,在选择“计算节点规格”时选择“自定义规格”,设置小一些或者选择小规格的服务节点规格,当资源池节点可以容纳多个服务节点规格时,就可以部署多个服务。如果使用此方式进行部署推理,选择的规格务必满足模型的要求,当设置的规格过小,无法满足模型的最小推理要求时,则会出现部署失败或预测失败的情况。 图1 设置自定义规格 父主题: 资源池
  • 增量训练的操作步骤 登录ModelArts管理控制台,单击左侧导航栏的自动学习。 在自动学习项目管理页面,单击对应的项目名称,进入此项目的自动学习详情页。 在数据标注页面,单击未标注页签,在此页面中,您可以单击添加图片,或者增删标签。 如果增加了图片,您需要对增加的图片进行重新标注。如果您增删标签,建议对所有的图片进行排查和重新标注。对已标注的数据, 也需要检查是否需要增加新的标签。 在图片都标注完成后,单击右上角“开始训练”,在“训练设置”中,在“增量训练版本”中选择之前已完成的训练版本,在此版本基础上进行增量训练。其他参数请根据界面提示填写。 设置完成后,单击“确定”,即进行增量训练。系统将自动跳转至“模型训练”页面,待训练完成后,您可以在此页面中查看训练详情,如“训练精度”、“评估结果”、“训练参数”等。 图1 选择增量训练版本
  • 在线服务预测时,如何提高预测速度? 部署在线服务时,您可以选择性能更好的“计算节点规格”提高预测速度。例如使用GPU资源代替CPU资源。 部署在线服务时,您可以增加“计算节点个数”。 如果节点个数设置为1,表示后台的计算模式是单机模式;如果节点个数设置大于1,表示后台的计算模式为分布式的。您可以根据实际需求进行选择。 推理速度与模型复杂度强相关,您可以尝试优化模型提高预测速度。 ModelArts中提供了模型版本管理的功能,方便溯源和模型反复调优。 图1 部署在线服务 父主题: 在线服务
  • 处理方法 不管是用方式1还是方式2,要判断是否是模型服务返回的不合预期的结果都需要获取到本次推理请求的response header及response body。 如果是方式1,可以通过浏览器的开发者工具获取到推理请求的response信息。以Chrome浏览器为例,可以使用快捷键F12打开开发者工具,然后选择“Network”页签,再单击“预测”,可以在Network页签窗口中看到本次推理请求的response信息如下图。 图1 推理请求的response信息 在name栏找到推理请求,其中推理请求的URL包含“/v1/infers”的关键字,可以在header栏中的url看到完整url,分别在Headers页签及Response页签中查看response的信息。 如果是方式2可以根据不同的工具查看response header及body信息,比如CURL命令可以通过-I选项查看response header。 如果查看到的response header中Server字段为ModelArts且response body中没有显示ModelArts.XXXX的错误码,此时收到的response信息为模型服务返回的response信息,如果不符合预期,可以判断为模型服务返回的结果不符合预期。
  • 建议与总结 鉴于模型服务有从对象存储服务(OBS)中导入,从容器镜像中导入,从AI Gallery中获取等多种途径,对于上述不同模型服务的来源所产生的常见问题及处理方法建议如下: 从容器镜像中导入:由于此种方式镜像为用户完全自定义的镜像,错误原因会因自定义镜像的不同而不同,建议查看模型日志确定错误原因。 从对象存储服务(OBS)中导入:如您收到的返回是MR系列错误码,如MR.0105,请查看在线服务详情页面的日志页签查看对应的错误日志。 从AI Gallery中获取:请咨询该模型在AI Gallery中的发布者。
共100000条