华为云用户手册

  • 角色与策略权限管理 ModelArts服务支持角色与策略授权。默认情况下,管理员创建的IAM用户没有任何权限,需要将其加入用户组,并给用户组授予策略或角色,才能使得用户组中的用户获得对应的权限,这一过程称为授权。授权后,用户就可以基于被授予的权限对云服务进行操作。 ModelArts部署时通过物理区域划分,为项目级服务。授权时,“授权范围”需要选择“指定区域项目资源”,然后在指定区域(如华北-北京1)对应的项目(cn-north-1)中设置相关权限,并且该权限仅对此项目生效;如果“授权范围”选择“所有资源”,则该权限在所有区域项目中都生效。访问ModelArts时,需要先切换至授权区域。 如表1所示,包括了ModelArts的所有系统策略权限。如果系统预置的ModelArts权限,不满足您的授权要求,可以创建自定义策略,可参考策略JSON格式字段介绍。 表1 ModelArts系统策略 策略名称 描述 类型 ModelArts FullAccess ModelArts管理员用户,拥有所有ModelArts服务的权限。 系统策略 ModelArts CommonOperations ModelArts操作用户,拥有所有ModelArts服务操作权限除了管理专属资源池的权限。 系统策略 ModelArts Dependency Access ModelArts服务的常用依赖服务的权限。 系统策略 ModelArts对其他云服务有依赖关系,因此在ModelArts控制台的各项功能需要配置相应的服务权限后才能正常查看或使用,依赖服务及其预置的权限如下。 表2 ModelArts控制台依赖服务的角色或策略 控制台功能 依赖服务 需配置角色/策略 数据管理 对象存储服务OBS OBS Administrator 数据湖探索DLI DLI FullAccess MapReduce服务MRS MRS Administrator 数据仓库服务GaussDB(DWS) DWS Administrator 云审计服务CTS CTS Administrator AI开发平台ModelArts ModelArts CommonOperations ModelArts Dependency Access 开发环境 对象存储服务OBS OBS Administrator 凭据管理服务CSMS CSMS ReadOnlyAccess 云审计服务CTS CTS Administrator 弹性云服务器ECS ECS FullAccess 容器镜像服务SWR SWR Administrator 弹性文件服务SFS SFS Turbo FullAccess 应用运维管理服务AOM AOM FullAccess 密钥管理服务KMS KMS CMKFullAccess AI开发平台ModelArts ModelArts CommonOperations ModelArts Dependency Access 训练管理 对象存储服务OBS OBS Administrator 消息通知服务SMN SMN Administrator 云审计服务CTS CTS Administrator 弹性文件服务SFS Turbo SFS Turbo ReadOnlyAccess 容器镜像服务SWR SWR Administrator 应用运维管理服务AOM AOM FullAccess 密钥管理服务KMS KMS CMKFullAccess AI开发平台ModelArts ModelArts CommonOperations ModelArts Dependency Access Workflow 对象存储服务OBS OBS Administrator 云审计服务CTS CTS Administrator AI开发平台ModelArts ModelArts CommonOperations ModelArts Dependency Access 自动学习 对象存储服务OBS OBS Administrator 云审计服务CTS CTS Administrator AI开发平台ModelArts ModelArts CommonOperations ModelArts Dependency Access AI应用管理 对象存储服务OBS OBS Administrator 企业项目管理服务EPS EPS FullAccess 云审计服务CTS CTS Administrator 容器镜像服务SWR SWR Administrator AI开发平台ModelArts ModelArts CommonOperations ModelArts Dependency Access 部署上线 对象存储服务OBS OBS Administrator 云监控服务CES CES ReadOnlyAccess 消息通知服务SMN SMN Administrator 企业项目管理服务EPS EPS FullAccess 云审计服务CTS CTS Administrator 云日志服务LTS LTS FullAccess 虚拟私有云VPC VPC FullAccess AI开发平台ModelArts ModelArts CommonOperations ModelArts Dependency Access AI Gallery 对象存储服务OBS OBS Administrator 云审计服务CTS CTS Administrator 容器镜像服务SWR SWR Administrator AI开发平台ModelArts ModelArts CommonOperations ModelArts Dependency Access 专属资源池 云审计服务CTS CTS Administrator 云容器引擎CCE CCE Administrator 裸金属服务器BMS BMS FullAccess 镜像服务IMS IMS FullAccess 数据加密服务DEW DEW KeypairReadOnlyAccess 虚拟私有云VPC VPC FullAccess 弹性云服务器ECS ECS FullAccess 弹性文件服务SFS SFS Turbo FullAccess 对象存储服务OBS OBS Administrator 应用运维管理服务AOM AOM FullAccess 标签管理服务TMS TMS FullAccess AI开发平台ModelArts ModelArts FullAccess 费用中心 BSS Administrator 如果系统预置的权限,不满足您的授权要求,可以创建自定义策略。自定义策略中可以添加的授权项(Action)请参考ModelArts资源权限项。 目前华为云云服务平台支持以下两种方式创建自定义策略: 可视化视图创建自定义策略:无需了解策略语法,按可视化视图导航栏选择云服务、操作、资源、条件等策略内容,可自动生成策略。 JSON视图创建自定义策略:可以在选择策略模板后,根据具体需求编辑策略内容;也可以直接在编辑框内编写JSON格式的策略内容。 具体创建步骤请参见:创建自定义策略。下面为您介绍常用的ModelArts自定义策略样例。 示例1:授权镜像管理的权限。 { "Version": "1.1", "Statement": [ { "Effect": "Allow", "Action": [ "modelarts:image:register", "modelarts:image:listGroup" ] } ] } 示例2:拒绝用户创建、更新、删除专属资源池。 拒绝策略需要同时配合其他策略使用,否则没有实际作用。用户被授予的策略中,一个授权项的作用如果同时存在Allow和Deny,则遵循Deny优先原则。 { "Version": "1.1", "Statement": [ { "Action": [ "modelarts:*:*" ], "Effect": "Allow" }, { "Action": [ "swr:*:*" ], "Effect": "Allow" }, { "Action": [ "smn:*:*" ], "Effect": "Allow" }, { "Action": [ "modelarts:pool:create", "modelarts:pool:update", "modelarts:pool:delete" ], "Effect": "Deny" } ] } 示例3:多个授权项策略。 一个自定义策略中可以包含多个授权项,且除了可以包含本服务的授权项外,还可以包含其他服务的授权项,可以包含的其他服务必须跟本服务同属性,即都是项目级服务或都是全局级服务。多个授权语句策略描述如下: { "Version": "1.1", "Statement": [ { "Effect": "Allow", "Action": [ "modelarts:service:*" ] }, { "Effect": "Allow", "Action": [ "lts:logs:list" ] } ] }
  • API替换总览 •torch_npu.optim.NpuFusedAdamW •optimizer.clip_grad_norm_fused_ •torch_npu.npu_confusion_transpose •torch_npu.npu_scaled_masked_softmax •torch_npu.fast_gelu •torch_npu.npu_rms_norm •torch_npu.npu_swiglu •torch_npu.npu_rotary_mul •torch_npu.npu_fusion_attention 上述torch_npu api的功能和参数描述见概述。
  • 优化器替换 替换优化器一般都能有较大的性能受益,可以优先考虑将torch原生的优化器替换为昇腾提供的亲和优化器。下文以AdamW优化器为例,其他优化器的替换方式一致。 torch_npu.optim.NpuFusedAdamW torch原生代码示例如下: import torch optimizer = torch.optim.AdamW( model.parameters(), learning_rate, momentum=momentum, weight_decay=weight_decay ) torch_npu代码示例如下: import torch_npu from torch_npu.contrib import transfer_to_npu optimizer = torch_npu.optim.NpuFusedAdamW( model.parameters(), learning_rate, momentum=momentum, weight_decay=weight_decay )
  • 查看日志 训练过程中,训练日志会在最后的Rank节点打印。 图1 打印训练日志 训练完成后,如果需要单独获取训练日志文件,可以在${SAVE_PATH}/logs路径下获取。日志存放路径为{work_dir}/saved_dir_for_ma_output/Llama2-70B/logs,本实例日志路径为/home/ma-user/ws/saved_dir_for_ma_output/Llama2-70B/logs
  • 查看性能 训练性能主要通过训练日志中的2个指标查看,吞吐量和loss收敛情况。 吞吐量(tokens/s/p):global batch size*seq_length/(总卡数*elapsed time per iteration)*1000,其参数在日志里可找到,默认seq_len值为4096。Llama2-70B默认global batch size为1024,具体参数查看表1 中GBS值;其global batch size(GBS)、seq_len(SEQ_LEN)为训练时设置的参数。 loss收敛情况:日志里存在lm loss参数 ,lm loss参数随着训练迭代周期持续性减小,并逐渐趋于稳定平缓。也可以使用可视化工具TrainingLogParser查看loss收敛情况,如图2所示。 单节点训练:训练过程中的loss直接打印在窗口上。 多节点训练:训练过程中的loss打印在最后一个节点上。 图2 Loss收敛情况(示意图)
  • 权限清单 权限 表1 开发环境所需权限 业务场景 依赖的服务 依赖策略项 支持的功能 配置建议 开发环境实例生命周期管理 ModelArts modelarts:notebook:create modelarts:notebook:list modelarts:notebook:get modelarts:notebook:update modelarts:notebook:delete modelarts:notebook:start modelarts:notebook:stop modelarts:notebook:updateStopPolicy modelarts:image:delete modelarts:image:list modelarts:image:create modelarts:image:get modelarts:pool:list modelarts:tag:list modelarts:network:get aom:metric:get aom:metric:list aom:alarm:list 实例的启动、停止、创建、删除、更新等依赖的权限。 建议配置。 仅在严格授权模式开启后,需要显式配置左侧权限。 动态挂载存储配置 ModelArts modelarts:notebook:listMountedStorages modelarts:notebook:mountStorage modelarts:notebook:getMountedStorage modelarts:notebook:umountStorage 动态挂载存储配置。 按需配置。 OBS obs:bucket:ListAllMyBuckets obs:bucket:ListBucket 镜像管理 ModelArts modelarts:image:register modelarts:image:listGroup 在镜像管理中注册和查看镜像。 按需配置。 保存镜像 SWR SWR Admin SWR Admin为SWR最大权限,用于: 开发环境运行的实例,保存成镜像。 使用自定义镜像创建开发环境Notebook实例。 按需配置。 使用SSH功能 ECS ecs:serverKeypairs:list ecs:serverKeypairs:get ecs:serverKeypairs:delete ecs:serverKeypairs:create 为开发环境Notebook实例配置登录密钥。 按需配置。 DEW kps:domainKeypairs:get kps:domainKeypairs:list 挂载SFS Turbo盘 SFS Turbo SFS Turbo FullAccess 子用户对SFS目录的读写操作权限。专属池Notebook实例挂载SFS(公共池不支持),且挂载的SFS不是当前子用户创建的。 按需配置。 查看所有实例 ModelArts modelarts:notebook:listAllNotebooks ModelArts开发环境界面上,查询所有用户的实例列表,适用于给开发环境的实例管理员配置该权限。 按需配置。 IAM iam:users:listUsers VSCode插件(本地)/ PyCharm Toolkit(本地) ModelArts modelarts:notebook:listAllNotebooks modelarts:trainJob:create modelarts:trainJob:list modelarts:trainJob:update modelarts:trainJobVersion:delete modelarts:trainJob:get modelarts:trainJob:logExport modelarts:workspace:getQuotas(如果开通了工作空间功能,则需要配置此权限。) 从本地VSCode连接云上的Notebook实例、提交训练作业等。 按需配置。 OBS obs:bucket:ListAllMybuckets obs:bucket:HeadBucket obs:bucket:ListBucket obs:bucket:GetBucketLocation obs:object:GetObject obs:object:GetObjectVersion obs:object:PutObject obs:object:DeleteObject obs:object:DeleteObjectVersion obs:object:ListMultipartUploadParts obs:object:AbortMultipartUpload obs:object:GetObjectAcl obs:object:GetObjectVersionAcl obs:bucket:PutBucketAcl obs:object:PutObjectAcl obs:object:ModifyObjectMetaData IAM iam:projects:listProjects 从本地PyCharm查询IAM项目列表,完成连接配置。 VPC接入 VPC VPC ReadOnlyAccess 实例能够挂载在用户的VPC下,实现多网络平面接入。 按需配置。 创建自定义策略时,建议将项目级云服务和全局级云服务拆分为两条策略,便于授权时设置最小授权范围。 委托 表2 开发环境所需委托 业务场景 依赖的服务 委托授权项 说明 配置建议 JupyterLab OBS obs:object:DeleteObject obs:object:GetObject obs:object:GetObjectVersion obs:bucket:CreateBucket obs:bucket:ListBucket obs:bucket:ListAllMyBuckets obs:object:PutObject obs:bucket:GetBucketAcl obs:bucket:PutBucketAcl obs:bucket:PutBucketCORS 通过ModelArts的Notebook,在JupyterLab中使用OBS上传下载数据。 建议配置。 开发环境监控功能 AOM aom:alarm:put 调用AOM的接口,获取Notebook相关的监控数据和事件,展示在ModelArts的Notebook中。 建议配置。 VPC接入 VPC vpc:ports:create vpc:ports:get vpc:ports:delete vpc:subnet:get 实例能够挂载在用户的VPC下,实现多网络平面接入。 按需配置。
  • 操作步骤 下载MLNX_OFED_LINUX-4.3-1.0.1.0-ubuntu16.04-x86_64.tgz。 进入地址,单击“Download”,选择“Archive Versions”,“Version”选择“4.3-1.0.1.0”,“OS Distribution”选择“Ubuntu”,“OS Distribution Version”选择“Ubuntu 16.04”,“Architecture”选择“x86_64”,下载MLNX_OFED_LINUX-4.3-1.0.1.0-ubuntu16.04-x86_64.tgz。 宿主机安装的infiniband驱动版本为4.3-1.0.1.0,容器镜像中安装的infiniband驱动版本需要与宿主机版本匹配,即同为4.3-1.0.1.0。 可能部分区域的网卡较新,会出现更高版本的infiniband驱动版本,如果您遇到了infiniband驱动安装后,仍然无法使能infiniband网卡的问题,可以咨询相关运维人员以确认宿主机的实际infiniband驱动版本。 图1 下载驱动 参考如下Dockerfile中,以在容器镜像中安装infiniband驱动。 USER root # copy MLNX_OFED_LINUX-4.3-1.0.1.0-ubuntu16.04-x86_64.tgz to docker image RUN tar xzvf MLNX_OFED_LINUX-4.3-1.0.1.0-ubuntu16.04-x86_64.tgz && \ cd MLNX_OFED_LINUX-4.3-1.0.1.0-ubuntu16.04-x86_64 && \ chmod +x mlnxofedinstall && \ ./mlnxofedinstall --user-space-only --without-fw-update --force && \ cd - && \ rm MLNX_OFED_LINUX-4.3-1.0.1.0-ubuntu16.04-x86_64.tgz && \ rm -rf MLNX_OFED_LINUX-4.3-1.0.1.0-ubuntu16.04-x86_64 USER ma-user 验证infiniband驱动是否安装成功。 在训练代码中执行以下命令,如果无报错则infiniband驱动安装成功: os.system("ofed_info")
  • Step1 创建OBS桶和文件夹 在OBS服务中创建桶和文件夹,用于存放样例数据集以及训练代码。如下示例中,请创建命名为“test-modelarts”的桶,并创建如表1所示的文件夹。 创建OBS桶和文件夹的操作指导请参见创建桶和新建文件夹。 请确保您使用的OBS与ModelArts在同一区域。 表1 OBS桶文件夹列表 文件夹名称 用途 obs://test-modelarts/ascend/demo-code/ 用于存储Ascend训练脚本文件。 obs://test-modelarts/ascend/demo-code/run_ascend/ 用于存储Ascend训练脚本的启动脚本。 obs://test-modelarts/ascend/log/ 用于存储训练日志文件。
  • 准备工作 注册华为账号并开通华为云、实名认证 注册华为账号并开通华为云 进行实名认证 个人用户推荐使用人脸识别认证。 如果无中国大陆身份证,仅可使用其他证件认证,并需等待三个工作日审核。 配置委托访问授权 ModelArts使用过程中涉及到OBS、SWR、IEF等服务交互,首次使用ModelArts需要用户配置委托授权,允许访问这些依赖服务。 使用华为云账号登录ModelArts管理控制台,在左侧导航栏单击“全局配置”,进入“全局配置”页面,单击“添加授权”。 在弹出的“访问授权”窗口中, 授权对象类型:所有用户 委托选择:新增委托 权限配置:普通用户 选择完成后勾选“我已经详细阅读并同意《ModelArts服务声明》”,然后单击“创建”。 图1 配置委托访问授权 完成配置后,在ModelArts控制台的全局配置列表,可查看到此账号的委托配置信息。 图2 查看委托配置信息
  • Step1 创建OBS桶和文件夹 在OBS服务中创建桶和文件夹,用于存放样例数据集以及训练代码。需要创建的文件夹列表如表1所示,示例中的桶名称“test-modelarts” 和文件夹名称均为举例,请替换为用户自定义的名称。 创建OBS桶和文件夹的操作指导请参见创建桶和新建文件夹。 请确保您使用的OBS与ModelArts在同一区域。 表1 OBS桶文件夹列表 文件夹名称 用途 “obs://test-modelarts/mpi/demo-code/” 用于存储MPI启动脚本与训练脚本文件。 “obs://test-modelarts/mpi/log/” 用于存储训练日志文件。
  • 理解ModelArts的权限与委托 图1 权限管理抽象 ModelArts与其他服务类似,对外暴露的每个功能,都通过IAM的权限来进行控制。比如,用户(此处指IAM子用户,而非租户)希望在ModelArts创建训练作业,则该用户必须拥有 "modelarts:trainJob:create" 的权限才可以完成操作(无论界面操作还是API调用)。关于如何给一个用户赋权(准确讲是需要先将用户加入用户组,再面向用户组赋权),可以参考IAM的文档《权限管理》。 而ModelArts还有一个特殊的地方在于,为了完成AI计算的各种操作,AI平台在任务执行过程中需要访问用户的其他服务,典型的就是训练过程中,需要访问OBS读取用户的训练数据。在这个过程中,就出现了ModelArts“代表”用户去访问其他云服务的情形。从安全角度出发,ModelArts代表用户访问任何云服务之前,均需要先获得用户的授权,而这个动作就是一个“委托”的过程。用户授权ModelArts再代表自己访问特定的云服务,以完成其在ModelArts平台上执行的AI计算任务。 综上,对于图1 权限管理抽象可以做如下解读: 用户访问任何云服务,均是通过标准的IAM权限体系进行访问控制。用户首先需要具备相关云服务的权限(根据您具体使用的功能不同,所需的相关服务权限多寡亦有差异)。 权限:用户使用ModelArts的任何功能,亦需要通过IAM权限体系进行正确权限授权。 委托:ModelArts上的AI计算任务执行过程中需要访问其他云服务,此动作需要获得用户的委托授权。
  • ModelArts权限管理 默认情况下,管理员创建的IAM用户没有任何权限,需要将其加入用户组,并给用户组授予策略,才能使得用户组中的用户获得对应的权限,这一过程称为授权。授权后,用户就可以基于授予的权限对云服务进行操作。 ModelArts部署时通过物理区域划分,为项目级服务,授权时“选择授权范围方案”可以选择“指定区域项目资源”,如果授权时指定了区域(如华北-北京4)对应的项目(cn-north-4),则该权限仅对此项目生效;简单的做法是直接选择“所有资源”。 ModelArts也支持企业项目,所以选择授权范围方案时,也可以指定企业项目。具体操作参见《创建用户组并授权》。 IAM在对用户组授权的时候,并不是直接将具体的某个权限进行赋权,而是需要先将权限加入到“策略”当中,再把策略赋给用户组。为了方便用户的权限管理,各个云服务都提供了一些预置的“系统策略”供用户直接使用。如果预置的策略不能满足您的细粒度权限控制要求,则可以通过“自定义策略”来进行精细控制。 表1列出了ModelArts的所有预置系统策略。 表1 ModelArts系统策略 策略名称 描述 类型 ModelArts FullAccess ModelArts管理员用户,拥有所有ModelArts服务的权限 系统策略 ModelArts CommonOperations ModelArts操作用户,拥有所有ModelArts服务操作权限除了管理专属资源池的权限 系统策略 ModelArts Dependency Access ModelArts服务的常用依赖服务的权限 系统策略 通常来讲,只给管理员开通“ModelArts FullAccess”,如果不需要太精细的控制,直接给所有用户开通“ModelArts CommonOperations”即可满足大多数小团队的开发场景诉求。如果您希望通过自定义策略做深入细致的权限控制,请阅读ModelArts的IAM权限控制详解。 ModelArts的权限不会凌驾于其他服务的权限之上,当您给用户进行ModelArts赋权时,系统不会自动对其他相关服务的相关权限进行赋权。这样做的好处是更加安全,不会出现预期外的“越权”,但缺点是,您必须同时给用户赋予不同服务的权限,才能确保用户可以顺利完成某些ModelArts操作。 举例,如果用户需要用OBS中的数据进行训练,当已经为IAM用户配置ModelArts训练权限时,仍需同时为其配置对应的OBS权限(读、写、列表),才可以正常使用。其中OBS的列表权限用于支持用户从ModelArts界面上选择要进行训练的数据路径;读权限主要用于数据的预览以及训练任务执行时的数据读取;写权限则是为了保存训练结果和日志。 对于个人用户或小型组织,一个简单做法是为IAM用户配置“作用范围”为“全局级服务”的“Tenant Administrator”策略,这会使用户获得除了IAM以外的所有用户权限。在获得便利的同时,由于用户的权限较大,会存在相对较大的安全风险,需谨慎使用。(对于个人用户,其默认IAM账号就已经属于admin用户组,且具备Tenant Administrator权限,无需额外操作) 当您需要限制用户操作,仅为ModelArts用户配置OBS相关的最小化权限项,具体操作请参见OBS权限管理。对于其他云服务,也可以进行精细化权限控制,具体请参考对应的云服务文档。
  • 严格授权模式 严格授权模式是指在IAM中创建的子用户必须由账号管理员显式在IAM中授权,才能访问ModelArts服务,管理员用户可以通过授权策略为普通用户精确添加所需使用的ModelArts功能的权限。 相对的,在非严格授权模式下,子用户不需要显式授权就可以使用ModelArts,管理员需要在IAM上为子用户配置Deny策略来禁止子用户使用ModelArts的某些功能。 账号的管理员用户可以在“全局配置”页面修改授权模式。 如无特殊情况,建议优先使用严格授权模式。在严格授权模式下,子用户要使用ModelArts的功能都需经过授权,可以更精确的控制子用户的权限范围,达成权限最小化的安全策略。
  • 用工作空间限制资源访问 工作空间是ModelArts面向企业客户提供的一个高阶功能,用于进一步将用户的资源划分在多个逻辑隔离的空间中,并支持以空间维度进行访问的权限限定。目前工作空间功能是“受邀开通”状态,作为企业用户您可以通过您对口的技术支持经理申请开通。 在开通工作空间后,系统会默认为您创建一个“default”空间,您之前所创建的所有资源,均在该空间下。当您创建新的工作空间之后,相当于您拥有了一个新的“ModelArts分身”,您可以通过菜单栏的左上角进行工作空间的切换,不同工作空间中的工作互不影响。 创建工作空间时,必须绑定一个企业项目。多个工作空间可以绑定到同一个企业项目,但一个工作空间不可以绑定多个企业项目。借助工作空间,您可以对不同用户的资源访问和权限做更加细致的约束,具体为如下两种约束: 只有被授权的用户才能访问特定的工作空间(在创建、管理工作空间的页面进行配置),这意味着,像数据集、算法等AI资产,均可以借助工作空间做访问的限制。 在前文提到的权限授权操作中,如果“选择授权范围方案”时设定为“指定企业项目资源”,那么该授权仅对绑定至该企业项目的工作空间生效。 工作空间的约束与权限授权的约束是叠加生效的,意味着对于一个用户,必须同时拥有工作空间的访问权和训练任务的创建权限(且该权限覆盖至当前的工作空间),他才可以在这个空间里提交训练任务。 对于已经开通企业项目但没有开通工作空间的用户,其所有操作均相当于在“default”企业项目里进行,请确保对应权限已覆盖了名为default的企业项目。 对于未开通企业项目的用户,不受上述约束限制。
  • HuggingFace权重转换操作 下载GLM3-6B的预训练权重和词表文件,并上传到/home/ma-user/ws/tokenizers/GLM3-6B目录下。具体下载地址请参见表1。如果已下载,忽略此步骤。 创建权重转换后的输出目录/home/ma-user/ws/processed_for_ma_input/GLM3-6B/converted_weights/。 cd /home/ma-user/ws/ #进入/home/ma-user/ws/目录 mkdir -p processed_for_ma_input/GLM3-6B/converted_weights 进入代码目录/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink,在此代码目录下执行2_convert_mg_hf.sh脚本。xxx-Ascend请根据实际目录替换。 #进入ModelLink目录下 cd /home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink # 执行权重格式转换脚本 TP=2 PP=4 LOAD_DIR=/home/ma-user/ws/tokenizers/GLM3-6B SAVE_DIR=/home/ma-user/ws/processed_for_ma_input/GLM3-6B/converted_weights TOKENIZER_PATH=/home/ma-user/ws/tokenizers/GLM3-6B CONVERT_HFtoMG=True sh ../scripts/glm3/2_convert_mg_hf.sh 其脚本2_convert_mg_hf.sh参数说明: --model-type:模型类型。 --loader:权重转换要加载检查点的模型名称。 --tensor-model-parallel-size:${TP} 张量并行数,需要与训练脚本中的配置一样。 --pipeline-model-parallel-size:${PP} 流水线并行数,需要与训练脚本中的配置一样。 --saver:检查模型保存名称。 --load-dir:${LOAD_DIR} 加载转换模型权重路径。 --save-dir : ${SAVE_DIR} 权重转换完成之后保存路径。 --tokenizer-model : ${TOKENIZER_PATH} tokenizer路径。 --add-qkv-bias : 为qkv这样的键和值添加偏差。 CONVERT_HFtoMG:权重转换类型是否为HuggingFace权重转换为Megatron格式,True表示HuggingFace权重转换为Megatron,反之False为Megatron格式转换HuggingFace格式。 权重转换完成后,在/home/ma-user/ws/processed_for_ma_input/GLM3-6B/converted_weights目录下查看转换后的权重文件。 图1 转换后的权重文件
  • 开发工具样例列表(高阶教程) 表2 Notebook样例列表 样例 镜像 对应功能 场景 说明 本地开发的MindSpore模型迁移至云上训练 MindSpore PyCharm ToolKit工具 目标检测 本案例介绍如何在本地进行MindSpore模型开发,并将模型迁移至ModelArts训练。 使用ModelArts VS Code插件进行模型开发(Ascend) MindSpore VS Code Toolkit工具 目标检测 本案例以Ascend Model Zoo为例,介绍如何通过VS Code插件及ModelArts Notebook进行云端数据调试及模型开发。 表3 算法套件样例列表 样例 镜像 对应功能 场景 说明 使用算法套件快速完成水表读数识别 PyTorch Notebook 图像识别 本案例提供了一个水表表盘读数识别的样例,使用ModelArts的自研分割算法(ivgSegmentation)和开源OCR算法(mmOCR)完成水表读数识别项目,并使用算法开发套件将其部署为华为云在线服务。
  • 模型训练-自定义算法样例列表(高阶教程) 表5 自定义算法样例列表 样例 镜像 对应功能 场景 说明 使用自定义算法构建模型实现手写数字识别 PyTorch 自定义算法 手写数字识别 使用用户自己的算法,训练得到手写数字识别模型,并部署后进行预测。 示例:从0到1制作自定义镜像并用于训练(PyTorch+CPU/GPU) PyTorch 镜像制作 自定义镜像训练 - 此案例介绍如何从0到1制作镜像,并使用该镜像在ModelArts平台上进行训练。镜像中使用的AI引擎是PyTorch,训练使用的资源是CPU或GPU。 示例:从0到1制作自定义镜像并用于训练(MPI+CPU/GPU) MPI 镜像制作 自定义镜像训练 - 此案例介绍如何从0到1制作镜像,并使用该镜像在ModelArts平台上进行训练。镜像中使用的AI引擎是MPI,训练使用的资源是CPU或GPU。 示例:从0到1制作自定义镜像并用于训练(Horovod-PyTorch+GPU) Horovod-PyTorch 镜像制作 自定义镜像训练 - 此案例介绍如何从0到1制作镜像,并使用该镜像在ModelArts平台上进行训练。镜像中使用的AI引擎是Horovod-PyTorch,训练使用的资源是GPU。 示例:从0到1制作自定义镜像并用于训练(MindSpore+GPU) MindSpore 镜像制作 自定义镜像训练 - 此案例介绍如何从0到1制作镜像,并使用该镜像在ModelArts平台上进行训练。镜像中使用的AI引擎是MindSpore,训练使用的资源是GPU。 示例:从0到1制作自定义镜像并用于训练(Tensorflow+GPU) Tensorflow 镜像制作 自定义镜像训练 - 此案例介绍如何从0到1制作镜像,并使用该镜像在ModelArts平台上进行训练。镜像中使用的AI引擎是Tensorflow,训练使用的资源是GPU。 示例:从 0 到 1 制作自定义镜像并用于训练(MindSpore+Ascend) MindSpore 镜像制作 自定义镜像训练 - 此案例介绍如何从0到1制作镜像,并使用该镜像在ModelArts平台上进行训练。镜像中使用的AI引擎是MindSpore,训练使用的资源是NPU。
  • Step8 精度评估 关闭数据集shuffle,保证训练数据一致。 修改/home/ma-user/open_clip/src/training/data.py文件,搜索get_wds_dataset函数,将两处shuffle关闭,修改代码如下。 if is_train: if not resampled: print("dataset unshuffled.") #pipeline.extend([ # detshuffle2( # bufsize=_SHARD_SHUFFLE_SIZE, # initial=_SHARD_SHUFFLE_INITIAL, # seed=args.seed, # epoch=shared_epoch, # ), # wds.split_by_node, # wds.split_by_worker, #]) print("wds unshuffled.") pipeline.extend([ # at this point, we have an iterator over the shards assigned to each worker at each node tarfile_to_samples_nothrow, # wds.tarfile_to_samples(handler=log_and_continue), # wds.shuffle( # bufsize=_SAMPLE_SHUFFLE_SIZE, # initial=_SAMPLE_SHUFFLE_INITIAL, # ), ]) 重新训练1个epoch。脚本参考内容如下。 cd /home/ma-user/open_clip python -m training.main \ --save-frequency 1 \ --zeroshot-frequency 1 \ --report-to tensorboard \ --train-data '/home/ma-user/open_clip/mscoco/{00000..00059}.tar' \ --train-num-samples 102400 \ --dataset-type webdataset \ --warmup 10000 \ --batch-size=256 \ --lr=1e-3 \ --wd=0.1 \ --epochs=1 \ --workers=8 \ --model ViT-B-32 训练完成后,tensorboard统计的记录会保存在/home/ma-user/open_clip/logs/xxx-model_ViT-B-32-lr_0.001-b_32-j_8-p_amp/tensorboard目录下。 通过docker cp命令将容器内tensorboard子目录拷贝到宿主机 /home下。 在宿主机上安装tensorboard并启动。 pip install tensorboard #安装 tensorboard --logdir=/home/tensorboard --bind_all #启动 启动成功后如下图所示。 图2 启动tensorboard 在浏览器访问http://{宿主机ip}:6006/。将train/loss导出为json,和GPU训练下导出的文件比较。
  • Step7 推理验证 首先将上面训练的最终模型文件epoch_29.pt 拷贝到/home/ma-user/open_clip目录下,然后在/home/ma-user/open_clip下,执行如下命令。 vi inference.py 将下面的代码拷贝进去后保存。 import os import torch from PIL import Image import open_clip if 'DEVICE_ID' in os.environ: print("DEVICE_ID:", os.environ['DEVICE_ID']) else: os.environ['DEVICE_ID'] = "0" model, _, preprocess = open_clip.create_model_and_transforms('ViT-B-32', pretrained='/home/ma-user/open_clip/epoch_29.pt') model = model.to("npu") tokenizer = open_clip.get_tokenizer('ViT-B-32') image = preprocess(Image.open("./docs/CLIP.png")).unsqueeze(0) text = tokenizer(["a diagram", "a dog", "a cat"]) print("input image shape:", image.shape) print("input text shape:", text.shape) with torch.no_grad(), torch.cuda.amp.autocast(): image = image.to("npu") text = text.to("npu") image_features = model.encode_image(image) text_features = model.encode_text(text) print("output image shape:", image_features.shape) print("output text shape:", text_features.shape) image_features /= image_features.norm(dim=-1, keepdim=True) text_features /= text_features.norm(dim=-1, keepdim=True) text_probs = (100.0 * image_features @ text_features.T).softmax(dim=-1) print("Label probs:", text_probs) # prints: [[1., 0., 0.]] 运行推理脚本。 python inference.py 由于./docs/CLIP.png图片是一张图表,因此结果值和第一个文本"a diagram"吻合,结果值会接近[[1., 0., 0.]]。
  • Step5 获取训练数据集 使用img2dataset工具下载数据集。首先需要在容器安装img2dataset,安装命令如下。 pip install img2dataset 参考官方指导下载开源mscoco数据集。 #下载metadata wget https://huggingface.co/datasets/ChristophSchuhmann/MS_COCO_2017_URL_TEXT/resolve/main/mscoco.parquet #使用img2dataset工具下载数据集 img2dataset --url_list mscoco.parquet --input_format "parquet"\ --url_col "URL" --caption_col "TEXT" --output_format webdataset\ --output_folder mscoco --processes_count 16 --thread_count 64 --image_size 256\ --enable_wandb True
  • Step4 下载并安装Open-clip源码包 从官网下载Open-clip源码包。下载地址:https://codeload.github.com/mlfoundations/open_clip/zip/refs/heads/main 下载open_clip-main.zip文件后解压,重命名为open_clip,然后拷贝到容器/home/ma-user目录下。 docker cp open_clip open-clip:/home/ma-user/ 修改文件夹权限(注意:此处需要重新启动一个终端,使用root用户登录容器,修改文件夹权限,修改完后关闭这个终端。) docker exec -it --user root open-clip bash chown -R ma-user:ma-group open_clip exit 在步骤2打开的终端中,使用默认用户ma-user安装源码。 cd open_clip make install 在步骤2打开的终端中,使用默认用户ma-user安装依赖。 pip install -r requirements-training.txt pip install -r requirements-test.txt pip install tensorboard
  • Step6 训练Open clip模型 适配昇腾代码。 在目录/home/ma-user/open_clip/src/training下,修改main.py文件,在第10行添加如下代码。 import torch_npu from torch_npu.contrib import transfer_to_npu 同样,修改train.py文件,在第11行添加如上代码,如图1所示。 图1 修改train.py文件 单卡训练。 训练命令参考如下。 cd /home/ma-user/open_clip python -m training.main \ --save-frequency 1 \ --zeroshot-frequency 1 \ --report-to tensorboard \ --train-data '/home/ma-user/open_clip/mscoco/{00000..00059}.tar' \ --train-num-samples 102400 \ --dataset-type webdataset \ --warmup 10000 \ --batch-size=256 \ --lr=1e-3 \ --wd=0.1 \ --epochs=30 \ --workers=8 \ --model ViT-B-32 参数说明: save-frequency:指定运行多少个epoch就保存模型参数,可以调大。 report-to tensorboard:指定输出loss指标到tensorboard,一般需要做精度评估才需要带上。 train-num-samples:指定每个epoch需要训练的样本个数,不超过总样本个数。 batch-size:指定一次处理的数据batch。 epochs:指定训练的epoch个数。 训练结束后,模型输出目录为: /home/ma-user/open_clip/logs/xxx-model_ViT-B-32-lr_0.001-b_32-j_8-p_amp/checkpoints 多卡训练 训练命令参考如下。 cd /home/ma-user/open_clip/src torchrun --nproc_per_node 4 -m training.main \ --save-frequency 1 \ --zeroshot-frequency 1 \ --report-to tensorboard \ --train-data '/home/ma-user/open_clip/mscoco/{00000..00059}.tar' \ --train-num-samples 102400 \ --dataset-type webdataset \ --warmup 10000 \ --batch-size=256 \ --lr=1e-3 \ --wd=0.1 \ --epochs=30 \ --workers=8 \ --model ViT-B-32
  • Step3 启动容器 启动容器镜像。启动前请先按照参数说明修改${}中的参数。可以根据实际需要增加修改参数。 docker run -itd \ --device=/dev/davinci0 \ --device=/dev/davinci_manager \ --device=/dev/devmm_svm \ --device=/dev/hisi_hdc \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ -v /usr/local/dcmi:/usr/local/dcmi \ -v /etc/ascend_install.info:/etc/ascend_install.info \ -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ -v /etc/localtime:/etc/localtime \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ --shm-size 32g \ --net=bridge \ -v ${work_dir}:${container_work_dir} \ --name ${container_name} \ ${image_name} bash 参数说明: --name ${container_name} 容器名称,进入容器时会用到,此处可以自己定义一个容器名称。 -v ${work_dir}:${container_work_dir} 代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的文件系统。work_dir为宿主机中工作目录,目录下存放着训练所需代码、数据等文件。container_work_dir为要挂载到的容器中的目录。为方便两个地址可以相同。 容器不能挂载到/home/ma-user目录,此目录为ma-user用户家目录。如果容器挂载到/home/ma-user下,拉起容器时会与基础镜像冲突,导致基础镜像不可用。 driver及npu-smi需同时挂载至容器。 ${image_name} 代表镜像地址。 通过容器名称进入容器中。使用默认用户ma-user启动容器。 docker exec -it ${container_name} bash
  • Step1 准备环境 请参考DevServer资源开通,购买DevServer资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。 当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问Openstack的管理地址(169.254.169.254),以防止容器获取宿主机的元数据。具体操作请参见禁止容器获取宿主机元数据。 检查环境。 SSH登录机器后,检查NPU设备检查。运行如下命令,返回NPU设备信息。 npu-smi info # 在每个实例节点上运行此命令可以看到NPU卡状态 npu-smi info -l | grep Total # 在每个实例节点上运行此命令可以看到总卡数 如出现错误,可能是机器上的NPU设备没有正常安装,或者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
  • Step4 下载原始模型包 从HuggingFace官网下载moondream2模型包到本地,下载地址:https://huggingface.co/vikhyatk/moondream2/tree/2024-03-06。 在宿主机上创建一个空目录/home/temp,将下载的模型包存放在宿主机/home/temp/moondream2目录下,修改目录权限后,拷贝到容器中。 mkdir /home/temp #创建一个空目录,将下载的模型包存放在宿主机/home/temp/moondream2目录下 chmod -R 777 moondream2 #修改moondream2目录权限 docker cp moondream2 moondream2:/home/ma-user/ #拷贝moondream2目录到容器中
  • Step1 准备环境 请参考DevServer资源开通,购买DevServer资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。 当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问Openstack的管理地址(169.254.169.254),以防止容器获取宿主机的元数据。具体操作请参见禁止容器获取宿主机元数据。 检查环境。 SSH登录机器后,检查NPU设备检查。运行如下命令,返回NPU设备信息。 npu-smi info # 在每个实例节点上运行此命令可以看到NPU卡状态 npu-smi info -l | grep Total # 在每个实例节点上运行此命令可以看到总卡数 如出现错误,可能是机器上的NPU设备没有正常安装,或者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
  • Step3 启动容器镜像 启动容器镜像。启动前请先按照参数说明修改${}中的参数。 docker run -itd \ --device=/dev/davinci1 \ --device=/dev/davinci_manager \ --device=/dev/devmm_svm \ --device=/dev/hisi_hdc \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ -v /usr/local/dcmi:/usr/local/dcmi \ -v /etc/ascend_install.info:/etc/ascend_install.info \ -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ --shm-size 32g \ --net=bridge \ -v ${work_dir}:${container_work_dir} \ --name ${container_name} \ ${image_name} 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_name}:容器镜像的名称。 通过容器名称进入容器中。 docker exec -it ${container_name} bash
  • 场景描述 以使用Notebook进行项目开发为例,管理员账号需要拥有ModelArts专属资源池的完全控制权限,以及Notebook所有实例的访问和操作权限。 普通开发者使用开发环境,只需关注对自己Notebook实例的操作权限,包括对自己实例的创建、启动、停止、删除等权限以及周边依赖服务的权限。普通开发者不需要ModelArts专属资源池的操作权限,也不需要查看其他用户的Notebook实例。 图1 账号关系示意图
  • 查看日志 训练过程中,训练日志会在最后的Rank节点打印。 图1 打印训练日志 训练完成后,如果需要单独获取训练日志文件,可以在${SAVE_PATH}/logs路径下获取。日志存放路径为{work_dir}/saved_dir_for_ma_output/BaiChuan2-13B/logs,本实例日志路径为/home/ma-user/ws/saved_dir_for_ma_output/BaiChuan2-13B/logs。
  • 查看性能 训练性能主要通过训练日志中的2个指标查看,吞吐量和loss收敛情况。 吞吐量(tokens/s/p):global batch size*seq_length/(总卡数*elapsed time per iteration)*1000,其参数在日志里可找到,默认seq_len值为4096,默认global batch size为64;其global batch size(GBS)、seq_len(SEQ_LEN)为训练时设置的参数。 loss收敛情况:日志里存在lm loss参数 ,lm loss参数随着训练迭代周期持续性减小,并逐渐趋于稳定平缓。也可以使用可视化工具TrainingLogParser查看loss收敛情况,如图2所示。 单节点训练:训练过程中的loss直接打印在窗口上。 多节点训练:训练过程中的loss打印在最后一个节点上。 图2 Loss收敛情况
共100000条