-
大模型微调需要的数据有要求吗? AI原生应用引擎用于大模型微调的数据集任务领域为“自然语言处理”、数据集格式为“对话文本”。 文件内容要求为标准json数组,例如: [{"instruction": "aaa", "input": "aaa", "output": "aaa"},{"instruction": "bbb", "input": "bbb", "output": "bbb"}] 父主题: AI原生应用引擎
-
Step5 在ModelArts上创建Notebook并调试 将上传到SWR上的镜像注册到ModelArts的镜像管理中。 登录ModelArts管理控制台,在左侧导航栏中选择“镜像管理 ”,单击“注册镜像”,根据界面提示注册镜像。注册后的镜像可以用于创建Notebook。 在Notebook中使用自定义镜像创建Notebook并调试,调试成功后,保存镜像。 在Notebook中使用自定义镜像创建Notebook操作请参见基于自定义镜像创建Notebook实例。 保存Notebook镜像操作请参见保存Notebook镜像环境。 已有的镜像调试成功后,再使用ModelArts训练模块训练作业。
-
训练mindspore-verification.py文件 mindspore-verification.py文件内容如下: import os
import numpy as np
from mindspore import Tensor
import mindspore.ops as ops
import mindspore.context as context
print('Ascend Envs')
print('------')
print('JOB_ID: ', os.environ['JOB_ID'])
print('RANK_TABLE_FILE: ', os.environ['RANK_TABLE_FILE'])
print('RANK_SIZE: ', os.environ['RANK_SIZE'])
print('ASCEND_DEVICE_ID: ', os.environ['ASCEND_DEVICE_ID'])
print('DEVICE_ID: ', os.environ['DEVICE_ID'])
print('RANK_ID: ', os.environ['RANK_ID'])
print('------')
context.set_context(device_target="Ascend")
x = Tensor(np.ones([1,3,3,4]).astype(np.float32))
y = Tensor(np.ones([1,3,3,4]).astype(np.float32))
print(ops.add(x, y))
-
场景描述 目标:构建安装如下软件的容器镜像,并在ModelArts平台上使用Ascend规格资源运行训练作业。 ubuntu-18.04 cann-8.0.0 (商用版本) python-3.7.13 mindspore-2.1.1 本教程以cann-8.0.0、mindspore-2.1.1为例介绍。 本示例仅用于示意Ascend容器镜像制作流程,且在匹配正确的Ascend驱动/固件版本的专属资源池上运行通过。
-
Step2 准备脚本文件并上传至OBS中 准备本案例所需训练脚本mindspore-verification.py文件和Ascend的启动脚本文件(共5个)。 训练脚本文件具体内容请参见训练mindspore-verification.py文件。 Ascend的启动脚本文件包括以下5个,具体脚本内容请参见Ascend的启动脚本文件。 run_ascend.py common.py rank_table.py manager.py fmk.py mindspore-verification.py和run_ascend.py脚本文件在创建训练作业时的“启动命令”参数中调用,具体请参见启动命令。 run_ascend.py脚本运行时会调用common.py、rank_table.py、manager.py、fmk.py脚本。 上传训练脚本mindspore-verification.py文件至OBS桶的“obs://test-modelarts/ascend/demo-code/”文件夹下。 上传Ascend的启动脚本文件(共5个)至OBS桶的“obs://test-modelarts/ascend/demo-code/run_ascend/”文件夹下。
-
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/ 用于存储训练日志文件。
-
Label相关指标介绍 表4 Label名字栏 指标对象 Label名字 Label描述 容器级别指标 modelarts_service 容器属于哪个服务,包含notebook,train和infer。 instance_name 容器所属pod的名字。 service_id 页面展示的实例或者job id。如开发环境为:cf55829e-9bd3-48fa-8071-7ae870dae93a, 训练作业为:9f322d5a-b1d2-4370-94df-5a87de27d36e node_ip 容器所属的节点IP值。 container_id 容器ID。 cid 集群ID。 container_name 容器名称。 project_id 用户所属的账号的project id。 user_id 提交作业的用户所属的账号的user id。 npu_id 昇腾卡的ID信息,比如davinci0(即将废弃)。 device_id 昇腾系列AI处理器的Physical ID。 device_type 昇腾系列AI处理器类型。 pool_id 物理专属池对应的资源池id。 pool_name 物理专属池对应的资源池name。 logical_pool_id 逻辑子池的id。 logical_pool_name 逻辑子池的name。 gpu_uuid 容器使用的GPU的UUID。 gpu_index 容器使用的GPU的索引。 gpu_type 容器使用的GPU的型号。 account_name 训练、推理或开发环境任务创建者的账号名。 user_name 训练、推理或开发环境任务创建者的用户名。 task_creation_time 训练、推理或开发环境任务的创建时间。 task_name 训练、推理或开发环境任务的名称。 task_spec_code 训练、推理或开发环境任务的规格。 cluster_name CCE集群名称。 node级别指标 cid 该node所属CCE集群的ID。 node_ip 节点的IP。 host_name 节点的主机名。 pool_id 物理专属池对应的资源池ID。 project_id 物理专属池的用户的project id。 npu_id 昇腾卡的ID信息,比如davinci0(即将废弃)。 device_id 昇腾系列AI处理器的Physical ID。 device_type 昇腾系列AI处理器类型。 gpu_uuid 节点上GPU的UUID。 gpu_index 节点上GPU的索引。 gpu_type 节点上GPU的型号。 device_name infiniband或RoCE网络网卡的设备名称。 port IB网卡的端口号。 physical_state IB网卡每个端口的状态。 firmware_version IB网卡的固件版本。 filesystem NFS挂载的文件系统。 mount_point NFS的挂载点。 Diagnos cid GPU所在节点所属的CCE集群ID。 node_ip GPU所在节点的IP。 pool_id 物理专属池对应的资源池ID。 project_id 物理专属池的用户的project id。 gpu_uuid GPU的UUID。 gpu_index 节点上GPU的索引。 gpu_type 节点上GPU的型号。 device_name 网络设备或磁盘设备的名称。 port IB网卡的端口号。 physical_state IB网卡每个端口的状态。 firmware_version IB网卡的固件版本。
-
网络相关指标 表3 Diagnos(IB,仅专属池上会收集) 分类 名称 指标 指标含义 单位 取值范围 infiniband或RoCE网络 PortXmitData infiniband_port_xmit_data_total The total number of data octets, divided by 4, (counting in double words, 32 bits), transmitted on all VLs from the port. 计数值 自然数 PortRcvData infiniband_port_rcv_data_total The total number of data octets, divided by 4, (counting in double words, 32 bits), received on all VLs from the port. 计数值 自然数 SymbolErrorCounter infiniband_symbol_error_counter_total Total number of minor link errors detected on one or more physical lanes. 计数值 自然数 LinkErrorRecoveryCounter infiniband_link_error_recovery_counter_total Total number of times the Port Training state machine has successfully completed the link error recovery process. 计数值 自然数 PortRcvErrors infiniband_port_rcv_errors_total Total number of packets containing errors that were received on the port including: Local physical errors (ICRC, VCRC, LPCRC, and all physical errors that cause entry into the BAD PACKET or BAD PACKET DISCARD states of the packet receiver state machine) Malformed data packet errors (LVer, length, VL) Malformed link packet errors (operand, length, VL) Packets discarded due to buffer overrun (overflow) 计数值 自然数 LocalLinkIntegrityErrors infiniband_local_link_integrity_errors_total This counter indicates the number of retries initiated by a link transfer layer receiver. 计数值 自然数 PortRcvRemotePhysicalErrors infiniband_port_rcv_remote_physical_errors_total Total number of packets marked with the EBP delimiter received on the port. 计数值 自然数 PortRcvSwitchRelayErrors infiniband_port_rcv_switch_relay_errors_total Total number of packets received on the port that were discarded when they could not be forwarded by the switch relay for the following reasons:
DLI D mapping VL mapping Looping (output port = input port) 计数值 自然数 PortXmitWait infiniband_port_transmit_wait_total The number of ticks during which the port had data to transmit but no data was sent during the entire tick (either because of insufficient credits or because of lack of arbitration). 计数值 自然数 PortXmitDiscards infiniband_port_xmit_discards_total Total number of outbound packets discarded by the port because the port is down or congested. 计数值 自然数
-
插件生命周期 表3 插件生命周期 状态 状态属性 说明 安装中 中间状态 插件正处于部署状态。 如遇到插件配置错误或资源不足所有实例均无法调度等情况,系统会在10分钟后将该插件置为“不可用”状态。 运行中 稳定状态 插件正常运行状态,所有插件实例均正常部署,插件可正常使用。 升级中 中间状态 插件正处于更新状态。 不可用 稳定状态 不可用,表示插件状态异常,插件不可使用。可单击状态查看失败原因。 删除中 中间状态 插件处于正在被删除的状态。 如果长时间处于该状态,则说明出现异常。
-
默认安装插件 在创建专属资源池时,会按照资源池类型、作业类型,默认安装相应的插件。 表1 默认安装插件简介 插件名称 插件简介 节点故障检测(ModelArts Node Agent) Modelarts节点故障检测是一款监控集群节点异常事件的插件,以及对接第三方监控平台功能的组件。它是一个在每个节点上运行的守护程序,可从不同的守护进程中搜集节点问题。 AI套件(NVIDIA GPU) AI套件(NVIDIA GPU)插件是支持在容器中使用GPU显卡的设备管理插件,集群中使用GPU节点时必须安装本插件。 创建专属资源池时,仅实例规格类型选择“GPU”时自动安装。 AI套件(Ascend NPU) AI套件(Ascend NPU)是支持容器里使用huawei NPU设备的管理插件。 创建专属资源池时,仅实例规格类型选择“Ascend”时自动安装。 Volcano调度器 Volcano 是一个基于 Kubernetes 的批处理平台,提供了机器学习、深度学习、生物信息学、基因组学及其他大数据应用所需要而 Kubernetes 当下缺失的一系列特性。 创建专属资源池时,作业类型选择“训练作业”时自动安装。
-
手动安装插件 可根据业务需求,选择性安装插件用于扩展资源池功能。 表2 手动安装插件简介 插件名称 插件简介 节点本地
域名 解析加速(NodeLocal DNSCache) NodeLocal DNSCache是运行在集群节点上的守护程序集,通过DNS缓存代理,提高集群DNS性能。 云原生日志采集插件 Log Collect是基于开源fluent-bit和opentelemetry构建的云原生日志、k8s事件采集插件。log-agent支持基于CRD的日志采集策略,可以根据您配置的策略规则,对集群中的容器标准输出日志、容器文件日志、节点日志及k8s事件日志进行采集与转发到LTS。同时支持上报k8s事件到
AOM ,用于配置事件告警,默认上报所有异常事件和部分正常事件。
-
上传本地超大文件(50GB以上)至JupyterLab 不支持在Notebook的JupyterLab中直接上传大小超过50GB的文件。 50GB以上的文件需要先从本地上传到OBS中,再在Notebook中调用ModelArts的Moxing接口或者SDK接口读写OBS中的文件。 图12 在Notebook中上传下载大文件 具体操作如下: 从本地上传文件至OBS。具体操作请参见上传文件至OBS桶。 将OBS中的文件下载到Notebook,可以通过在Notebook中运行代码的方式完成数据下载,具体方式有2种,ModelArts的SDK接口或者调用MoXing接口。 方法一:使用ModelArts SDK接口将OBS中的文件下载到Notebook后进行操作。 示例代码: 1
2
3 from modelarts.session import Session
session = Session()
session.obs.copy("obs://bucket-name/obs_file.txt","/home/ma-user/work/")
方法二:使用Moxing操作OBS文件将OBS中的文件同步到Notebook后进行操作。 import moxing as mox
#下载一个OBS文件夹sub_dir_0,从OBS下载至Notebook
mox.file.copy_parallel('obs://bucket_name/sub_dir_0', '/home/ma-user/work/sub_dir_0')
#下载一个OBS文件obs_file.txt,从OBS下载至Notebook
mox.file.copy('obs://bucket_name/obs_file.txt', '/home/ma-user/work/obs_file.txt') 如果下载到Notebook中的是zip文件,在Terminal中执行下列命令,解压压缩包。 unzip xxx.zip #在xxx.zip压缩包所在路径直接解压 代码执行完成后,参考图13打开Terminal后执行ls /home/ma-user/work命令查看下载到Notebook中的文件。或者在JupyterLab左侧导航中显示下载的文件,如果没有显示,请刷新后查看,如图14所示。 图13 打开Terminal 图14 查看下载到Notebook中的文件
-
上传本地大文件(100MB~50GB)至JupyterLab 对于大小超过100MB不超过50GB的文件可以使用OBS中转,系统先将文件上传至OBS(对象桶或并行文件系统),然后从OBS下载到Notebook。下载完成后,ModelArts会将文件自动从OBS中删除。 例如,对于下面这种情况,可以通过“OBS中转”上传。 图5 通过OBS中转上传大文件 如果使用OBS中转需要提供一个OBS中转路径,可以通过以下三种方式提供: 图6 通过OBS中转路径上传 仅第一次单击“OBS中转”需要提供OBS中转路径,以后默认使用该路径直接上传,可以通过上传文件窗口左下角的设置按钮更新OBS中转路径。如图10所示。 方式一:在输入框中直接输入有效的OBS中转路径,然后单击“确定”完成。 图7 输入有效的OBS中转路径 方式二:打开OBS File Browser选择一个OBS中转路径,然后单击“确定”完成。 图8 打开OBS File Browser 方式三:单击“使用默认路径”完成。 图9 使用默认路径上传文件 图10 设置本地文件OBS中转路径 完成OBS中转路径设置后,开始上传文件。 图11 上传文件 解压缩文件包 将文件以压缩包形式上传至Notebook JupyterLab后, 可在Terminal中解压缩文件包。 unzip xxx.zip #在xxx.zip压缩包所在路径直接解压 解压命令的更多使用说明可以在主流搜索引擎中查找Linux解压命令操作。
-
上传文件要求 对于大小不超过100MB的文件直接上传,并展示文件大小、上传进度及速度等详细信息。 对于大小超过100MB不超过50GB的文件可以使用OBS中转,系统先将文件上传OBS(对象桶或并行文件系统),然后从OBS下载到Notebook,上传完成后,会将文件从OBS中删除。 50GB以上的文件上传通过调用ModelArts SDK或者Moxing完成。 对于Notebook当前目录下已经有同文件名称的文件,可以覆盖继续上传,也可以取消。 支持10个文件同时上传,其余文件显示“等待上传”。不支持上传文件夹,可以将文件夹压缩成压缩包上传至Notebook后, 在Terminal中解压压缩包。 unzip xxx.zip #在xxx.zip压缩包所在路径直接解压 解压命令的更多使用说明可以在主流搜索引擎中查找Linux解压命令操作。 多个文件同时上传时,JupyterLab窗口最下面会显示上传文件总数和已上传文件数。
-
从JupyterLab中下载大于100MB的文件到本地 大于100MB的文件需要先从Notebook中上传到OBS,再从OBS下载到本地,具体操作如下: 打开Python运行环境。 以下图为例,在Launcher页面的Notebook区域,单击“python-3.7.10”。请您以实际环境为准。 图2 打开Python运行环境 使用MoXing将目标文件从Notebook上传到OBS中。 上传txt、压缩后文件夹的Python示例代码如下。代码中的“/home/ma-user/work/xxx”为文件在Notebook中的存储路径,“obs://bucket_name/xxx”为该文件上传到OBS的存储路径,请您按照实际路径进行修改。 上传一个obs_file.txt文件,从Notebook上传至OBS。 在命令行输入以下代码,按需修改路径后,单击运行代码。在OBS控制台的桶中,可以看到txt对象存在,表明上传成功。 1
2 import moxing as mox
mox.file.copy('/home/ma-user/work/obs_file.txt', 'obs://bucket_name/obs_file.txt')
图3 运行代码示例 上传一个压缩后的sub_dir_0文件夹,从Notebook上传至OBS。 在命令行输入以下代码,按需修改路径后,单击运行代码。在OBS控制台的桶中,可以看到文件夹对象存在,表明上传成功。 import moxing as mox
mox.file.copy_parallel('/home/ma-user/work/sub_dir_0', 'obs://bucket_name/sub_dir_0') 使用OBS或ModelArts SDK将OBS中的文件下载到本地。 方式一:使用OBS进行下载 在OBS中,可以将样例中的“obs_file.txt”下载到本地。如果您的数据较多,推荐OBS Browser+下载数据或文件夹。使用OBS下载文件的操作指导,请参见下载文件。 方式二:使用ModelArts SDK进行下载 在您的本地环境下载并安装ModelArts SDK。 完成ModelArts SDK的Session鉴权。 将OBS中的文件下载到本地,详情请参见从OBS下载数据。示例代码如下: 1
2
3
4
5
6
7
8
9
10 from modelarts.session import Session
# 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;
# 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。
__AK = os.environ["HUAWEICLOUD_SDK_AK"]
__SK = os.environ["HUAWEICLOUD_SDK_SK"]
# 如果进行了加密还需要进行解密操作
session = Session(access_key=__AK,secret_key=__SK, project_id='***', region_name='***')
session.download_data(bucket_path="/bucket_name/obs_file.txt",path="/home/user/obs_file.txt")