华为云用户手册

  • 原因分析 查看yum命令历史,发现执行了“yum update -y”,“yum update -y”命令是用于在Linux操作系统上更新软件包的命令。其中,选项-y表示在更新时自动确认所有提示信息,而不需要手动输入“y”确认。 请注意,使用此命令将会检查您系统中已安装的软件包并更新至最新版本。 图1 yum命令历史 查看NetworkManager配置: NetworkManager --print-config 配置内容如下: # NetworkManager configuration: /etc/NetworkManager/NetworkManager.conf (lib: 00-server.conf) [main] # plugins=ifcfg-rh,ibft # rc-manager=symlink # auth-polkit=true # dhcp=dhclient no-auto-default=* ignore-carrier=* [logging] # backend=journal # audit=false 发现“no-auto-default=*”是打开的状态,“no-auto-default=*”含义是关闭DH Client,无法使用DHCP获取IP。正常情况下裸金属服务器这个参数是被注释的状态。 当服务器有网卡配置文件, NetworkManager.service实现将VPC子网分配的私有IP写入网卡配置文件中。NetworkManager.service会优先读取网卡配置文件中的IP设置为主机IP, 此时无论DH Cient是否关闭,服务器都可以获取分配IP。 当服务器没有网卡配置文件时,DH Client开启,此时服务器会分配私有IP。如果关闭DH Client,则服务器无法获取私有IP。 图2 查看NetworkManager配置 图3 查看网络配置 命令“yum update -y”或“yum update NetworkManagre-config-server”,都会将NetworkManagre-config-server软件升级,高版本的NetworkManagre-config-server会将参数no-auto-default=*是打开的状态,又因当前镜像无网卡配置文件导致ip获取不到,从而使得SSH连接失败。
  • 操作步骤 使用以下脚本测得GPU服务器内NVLINK带宽性能。 import torch import numpy as np device = torch.device("cuda") n_gpus = 8 data_size = 1024 * 1024 * 1024 # 1 GB speed_matrix = np.zeros((n_gpus, n_gpus)) for i in range(n_gpus): for j in range(i + 1, n_gpus): print(f"Testing communication between GPU {i} and GPU {j}...") with torch.cuda.device(i): data = torch.randn(data_size, device=device) torch.cuda.synchronize() with torch.cuda.device(j): result = torch.randn(data_size, device=device) torch.cuda.synchronize() with torch.cuda.device(i): start = torch.cuda.Event(enable_timing=True) end = torch.cuda.Event(enable_timing=True) start.record() result.copy_(data) end.record() torch.cuda.synchronize() elapsed_time_ms = start.elapsed_time(end) transfer_rate = data_size / elapsed_time_ms * 1000 * 8 / 1e9 speed_matrix[i][j] = transfer_rate speed_matrix[j][i] = transfer_rate print(speed_matrix) 以Ant8 GPU裸金属服务器为例, 其理论GPU卡间带宽为:NVIDIA*NVLink*Bridge for 2GPUS: 400GB/s。使用上述测试脚本测得带宽性能进行如下分析。 正常模式-NVLINK全互通,带宽约为370GB。基本符合预期,且证明Ant GPU裸金属服务器内部GPU间确实走NVLINK模式,且完全互联。 图2 正常模式带宽性能 异常模式-NVLINK部分互通,出现带宽波动较大的情况。如下图中GPU0和GPU4之间带宽远低于理论值, 存在问题。 图3 异常模式带宽性能 出现这种现象, 可尝试重装nvidia/cuda/nvidia-fabricmanager, 重装后再测试又恢复到了正式模式,GPU0和GPU4之间带宽恢复到370GB/s。 可能原因如下,仅供参考: 驱动程序问题:可能是由于驱动程序没有正确安装或配置,导致NVLINK带宽受限。重新安装nvidia驱动、CUDA和nvidia-fabricmanager等软件后,驱动程序可能已经正确配置,从而解决了这个问题。 硬件问题:如果GPU之间的NVLINK连接存在硬件故障,那么这可能会导致带宽受限。重新安装软件后,重启系统,可能触发了某种硬件自检或修复机制,从而恢复了正常的带宽。 系统负载问题:最初测试GPU卡间带宽时,可能存在其他系统负载,如进程、服务等,这些负载会占用一部分网络带宽,从而影响NVLINK带宽的表现。重新安装软件后,这些负载可能被清除,从而使NVLINK带宽恢复正常。
  • 原因分析 经过对裸金属服务器排查,发现nvidia-drvier和cuda都已安装,并且正常运行。nvidia-fabricmanager服务可以使单节点GPU卡间互联,在多卡GPU机器上,出现这种问题可能是nvidia-fabricmanger异常导致。 执行以下命令,查看NVIDIA和CUDA的版本,以及nvidia-fabricmanager的状态。 systemctl status nvidia-fabricmanager 发现nvidia-fabricmanager的服务为failed状态,尝试重新启动nvidia-fabricmanager失败,且提示以下信息: nvidia-fabricmanager.service failed because the control process exited with error code 通过命令查看nvidia-fabricmanager的版本,发现nvidia-fabricmanager版本与当前NVIDIA驱动版本不一致。 dpkg -l | grep nvidia-fabricmanager 卸载并重新安装正确版本的nvidia-fabricmanager,验证CUDA成功。
  • 处理方法 查看nvidia-fabricmanager的版本,若nvidia-fabricmanager版本与当前NVIDIA驱动版本不一致则执行下述命令卸载nvidia-fabricmanager。 dpkg -l | grep nvidia-fabricmanager # 若有nvidia-fabricmanager软件,将其卸载 # 若无nvidia-fabricmanager软件,请跳过此命令 sudo apt-get autoremove --purge nvidia-fabricmanager-版本 安装与NVIDIA驱动版本号相等的nvidia-fabricmanager(以515.105.01举例)。 version=515.105.01 main_version=$(echo $version | awk -F '.' '{print $1}') apt-get update apt-get -y install nvidia-fabricmanager-${main_version}=${version}-* 启动nvidia-fabricmanager,确保其服务状态为RUNNING。 systemctl enable nvidia-fabricmanager systemctl start nvidia-fabricmanager systemctl status nvidia-fabricmanager 重新验证cuda状态, 输出为True。 import torch print(torch.cuda.is_available())
  • 原因分析 在CCE纳管过程中,需要通过cloudinit userdata机制拉取cce-agent,但是在服务器上查看没有拉cce-agent的动作,理论上该动作是cloudinit中的脚本在创建时自动执行的,可能是由于安装脚本没有注入userdata或者注入了但未执行。 经查看是由于userdata未执行,可能原因为服务器A制作镜像时没有清理残留目录导致,即: 镜像里面“/var/lib/cloud/instances”残留了制作镜像机器(后面称模板机)的实例ID信息,如果制作镜像不清理“/var/lib/cloud/*”就会导致用该镜像再重装模板机时,cloud-init根据残留目录(含实例ID)判断已经执行过一次,进而不会再执行user-data里面的脚本。 而使用该镜像的服务器B和C,由于实例ID信息和镜像中残留的服务器A实例ID不同,就会执行user-data,所以CCE能纳管成功。
  • 使用GPU A系列裸金属服务器有哪些注意事项? 使用华为云A系列裸金属服务器时有如下注意事项: nvidia-fabricmanager版本号必须和nvidia-driver版本号保持一致,可参考GP Ant8裸金属服务器Ubuntu 20.04安装NVIDIA 515+CUDA 11.7中的安装nvidia-fabricmanager方法。 NCCL必须和CUDA版本相匹配,可单击此处可查看配套关系和安装方法。 使用该裸金属服务器制作 自定义镜像 时, 必须清除残留文件,请参考清理文件。 父主题: FAQ
  • Python封装API方式切换操作系统 # -*- coding: UTF-8 -*- import requests import json import time import requests.packages.urllib3.exceptions from urllib3.exceptions import InsecureRequestWarning requests.packages.urllib3.disable_warnings(InsecureRequestWarning) class ServerOperation(object): ################################ IAM 认证API################################################# def __init__(self, account, password, region_name, username=None, project_id=None): """ :param username: if IAM user,here is small user, else big user :param account: account big big user :param password: account :param region_name: """ self.account = account self.username = username self.password = password self.region_name = region_name self.project_id = project_id self.ma_endpoint = "https://modelarts.{}.myhuaweicloud.com".format(region_name) self.service_endpoint = "https://bms.{}.myhuaweicloud.com".format(region_name) self.iam_endpoint = "https://iam.{}.myhuaweicloud.com".format(region_name) self.headers = {"Content-Type": "application/json", "X-Auth-Token": self.get_project_token_by_account(self.iam_endpoint)} def get_project_token_by_account(self, iam_endpoint): body = { "auth": { "identity": { "methods": [ "password" ], "password": { "user": { "name": self.username if self.username else self.account, "password": self.password, "domain": { "name": self.account } } } }, "scope": { "project": { "name": self.region_name } } } } headers = { "Content-Type": "application/json" } import json url = iam_endpoint + "/v3/auth/tokens" response = requests.post(url, headers=headers, data=json.dumps(body), verify=True) token = (response.headers['X-Subject-Token']) return token def change_os(self, server_id): url = "{}/v1/{}/baremetalservers/{}/changeos".format(self.service_endpoint, self.project_id, server_id) print(url) body = { "os-change": { "adminpass": "@Server", "imageid": "40d88eea-6e41-418a-ad6c-c177fe1876b8" } } response = requests.post(url, headers=self.headers, data=json.dumps(body), verify=False) print(json.dumps(response.json(), indent=1)) return response.json() if __name__ == '__main__': # 调用API前置准备,初始化认证鉴权信息 server = ServerOperation(username="xxx", account="xxx", password="xxx", project_id="xxx", region_name="cn-north-4") server.change_os(server_id="0c84bb62-35bd-4e1c-ba08-a3a686bc5097")
  • 使用BMS Go SDK的方式切换操作系统 package main import ( "fmt" "os" "github.com/huaweicloud/huaweicloud-sdk-go-v3/core/auth/basic" bms "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/bms/v1" "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/bms/v1/model" region "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/bms/v1/region" ) func main() { // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; // 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 ak := os.Getenv("HUAWEICLOUD_SDK_AK") sk := os.Getenv("HUAWEICLOUD_SDK_SK") auth := basic.NewCredentialsBuilder(). WithAk(ak). WithSk(sk). Build() client := bms.NewBmsClient( bms.BmsClientBuilder(). WithRegion(region.ValueOf("cn-north-4")). WithCredential(auth). Build()) keyname := "KeyPair-name" userdata := "aGVsbG8gd29ybGQsIHdlbGNvbWUgdG8gam9pbiB0aGUgY29uZmVyZW5jZQ==" request := &model.ChangeBaremetalServerOsRequest{ ServerId: "****input your bms instance id****", Body: &model.OsChangeReq{ OsChange: &model.OsChange{ Keyname: &keyname, Imageid: "****input your ims image id****", Metadata: &model.MetadataInstall{ UserData: &userdata, }, }, }, } response, err := client.ChangeBaremetalServerOs(request) if err == nil { fmt.Printf("%+v\n", response) } else { fmt.Println(err) } }
  • 处理方法 在当前安全组的入方向规则中添加一条规则,基本协议选择ICMP协议,详细配置如下表所示,添加规则步骤请参考添加安全组规则。 表1 入方向规则 方向 协议/应用 端口 源地址 入方向 ICMP 全部 0.0.0.0/0 华为 云安全 组支持的协议参考可参考下表。 表2 入方向规则 协议 端口 说明 协议 端口 说明 FTP 21 FTP服务上传和下载文件。 SSH 22 远程连接Linux弹性云服务器。 Telnet 23 使用Telnet协议访问网站。 SMTP 25 SMTP服务器所开放的端口,用于发送邮件。 基于安全考虑,TCP 25端口出方向默认被封禁,申请解封请参考TCP 25端口出方向无法访问时怎么办?。 HTTP 80 使用HTTP协议访问网站。 POP3 110 使用POP3协议接受邮件。 IMAP 143 使用IMAP协议接受邮件。 HTTPS 443 使用HTTPS协议访问网站。 SQL Server 1433 SQL Server的TCP端口,用于供SQL Server对外提供服务。 SQL Server 1434 SQL Server的TCP端口,用于返回SQLServer使用了哪个TCP/IP端口。 Oracle 1521 Oracle通信端口,弹性云服务器上部署了Oracle SQL需要放行的端口。 MySQL 3306 MySQL数据库对外提供服务的端口。 Windows Server Remote Desktop Services 3389 Windows远程桌面服务端口,通过这个端口可以连接Windows弹性云服务器。 代理 8080 8080端口常用于WWW代理服务,实现网页浏览,实现网页浏览。如果您使用8080端口,访问网站或使用代理服务器时,需要在IP地址后面加上:8080。安装Apache Tomcat服务后,默认服务端口为8080。 NetBIOS 137、138、139 NetBIOS协议常被用于Windows文件、打印机共享和Samba。 137、138:UDP端口,通过网上邻居传输文件时使用的端口。 139:通过这个端口进入的连接试图获得NetBIOS/SMB服务。
  • 问题现象 弹性文件服务(Scalable File Service,SFS)提供按需扩展的高性能文件存储(NAS),可以在裸金属服务器中通过网络协议挂载使用,SFS支持NFS和CIFS的网络协议。在使用裸金属服务器时, 将数据放在SFS盘中, 并发建立多个NFS链接、并发的读写数据、做大模型训练。 但有时候会出现读取速度变慢的现象,并且SFS提示报错"rpc_check_timeout:939 callbacks suppressed"。
  • 原因分析 根据SFS客户端 日志分析 出现问题的时间点发现,SFS盘连接的客户端个数较多,在问题的时间点并发读取数据,I/O超高;当前SFS服务端的机制是:当SFS盘的性能到上限时,就会IO排队。IO排队造成处理时间超过 1 分钟时,客户端内核会打印"rpc_check_timeout:939 callbacks suppressed"日志。这个日志只是说明某个IO处理时间超过 1 分钟了,不会造成数据丢失。客户端有重试机制,等峰值过去后,所有IO最终都会正确处理。所以理论上,出现该错误日志, 并不会造成数据丢失, 只是SFS客户端I/O速度变慢或卡顿,但最终会争取处理。
  • 原因分析 nvidia-modprobe是一个Linux工具,用于在系统中加载NVIDIA驱动程序及其相关的内核模块。在Linux系统上安装NVIDIA显卡驱动后,需要通过“nvidia-modprobe”命令来加载相应的内核模块,以便让显卡驱动正常工作。 通常情况下,在安装NVIDIA驱动时,会自动执行“nvidia-modprobe”命令,将必要的内核模块加载到系统中。但有时候也可能需要手动执行该命令。例如,在更新了NVIDIA驱动后,需要重新加载新版本的内核模块才能使变更生效。 此外,若使用了多个NVIDIA显卡,每个显卡都需要加载相应的内核模块才能正常工作。在这种情况下,也需要手动执行“nvidia-modprobe”命令来加载所有必要的内核模块。
  • Atlas 800训练服务器的网卡配置问题 机头网卡配置是什么? 有以下两类网卡: 四个2*100GE网卡,为RoCE网卡,插在NPU板。 一个4*25GE/10GE,为Hi1822网卡,插在主板上的。 ifconfig能看到的网卡信息吗 能看到主板上的网卡信息,即VPC分配的私有IP。若要看RoCE网卡的命令需要执行“hccn_tools”命令查看,参考Atlas 800 训练服务器 1.0.11 HCCN Tool接口参考中的指导。 NPU上的网卡在哪里可以看到, 会健康检查吗? 8*NPU的网卡为机头上配置的四个2*100GE网卡。华为云有网卡健康状态监控机制。
  • 原因分析 根据现象描述可能出现了nvidia-smi D+进程。 "D+"表示进程状态为"Uninterruptible Sleep (usually IO)",即进程正在等待I/O操作完成,此时无法被中断。 在正常情况下,nvidia-smi进程通常只会短暂地出现D+状态,因为它们是由内核控制的,该进程处于等待I/O操作完成的状态,可能是在读取或写入GPU相关的数据,这是正常的操作。但是,如果该进程一直处于"D+"状态,可能表明出现了I/O操作阻塞或其他问题,这可能导致系统死锁或其他问题。 如果想构造nvidia-smi D+进程,可以死循环一直执行nvidia-smi体验D+进程带来的系统不稳定性, 如: #!/bin/bash while true; do nvidia-smi & sleep 1 # 可以根据需要调整间隔时间 done 然后执行查看产生nvidia D+进程 ps -aux | grep -w D+ 结果如下: 图1 nvidia D+进程 此时可以观察你的训练任务或者执行“nvidia-smi”等命令,几乎是卡顿无法执行,因为内核IO已经阻塞, 无法执行相关GPU命令,只能尝试释放D+进程。
  • 处理方法 执行命令:lsmod | grep nvidia,查看内核中是否残留旧版nvidia,显示如下: nvidia_uvm 634880 8 nvidia_drm 53248 0 nvidia_modeset 790528 1 nvidia_drm nvidia 12312576 86 nvidia_modeset,nvidia_uvm 卸载nvidia相关模块 sudo rmmod nvidia_drm sudo rmmod nvidia_modeset sudo rmmod nvidia_uvm 最后卸载nvidia sudo rmmod nvidia 如果遇到“rmmod: ERROR: Module nvidia is in use”,执行以下命令: sudo lsof /dev/nvidia* 并再次验证: lsmod | grep nvidia 再次执行“nvidia-smi”,显示成功,且是最新安装的NVIDIA驱动。
  • 处理方法 查看nv_peer_mem是否已安装。 dpkg -i | grep peer 若未安装则需要安装,安装方法参考装机指导。 若已安装则进入下一检测项。 查看该软件是否已经加载至内核。 lsmod | grep peer 若没有则需要重新加载至内核,执行如下命令进行加载: /etc/init.d/nv_peer_mem start 如果执行失败,可能是未加载nv_peer_mem.conf至/etc/infiniband/中或nv_peer_mem不在/etc/init.d/中。 若找不到相关文件的问题,可以搜索相关文件在哪里,然后复制到指定目录,例如可执行如下命令: cp /tmp/nvidia-peer-memory-1.3/nv_peer_mem.conf /etc/infiniband/ cp /tmp/nvidia-peer-memory-1.3/debian/tmp/etc/init.d/nv_peer_mem /etc/init.d/
  • Step2 单机单卡训练 本小节使用上文的服务器环境和安装好的模型, 使用GP Ant8裸金属服务器, 完成单机单卡GPT-2 MEDIUM模型的训练。 创建预训练脚本文件。 执行以下命令,创建预训练脚本文件。 vim pretrain_gpt2.sh 在文件中添加以下信息。 #! /bin/bash # Runs the "345M" parameter model GPUS_PER_NODE=1 # Change for multinode config MASTER_ADDR=localhost MASTER_PORT=6000 NNODES=1 NODE_RANK=0 WORLD_SIZE=$(($GPUS_PER_NODE*$NNODES)) DATA_PATH=data/meg-gpt2_text_document CHECKPOINT_PATH=checkpoints/gpt2 DISTRIBUTED_ARGS="--nproc_per_node $GPUS_PER_NODE --nnodes $NNODES --node_rank $NODE_RANK --master_addr $MASTER_ADDR --master_port $MASTER_PORT" python -m torch.distributed.launch $DISTRIBUTED_ARGS \ pretrain_gpt.py \ --tensor-model-parallel-size 1 \ --pipeline-model-parallel-size 1 \ --num-layers 24 \ --hidden-size 1024 \ --num-attention-heads 16 \ --micro-batch-size 4 \ --global-batch-size 8 \ --seq-length 1024 \ --max-position-embeddings 1024 \ --train-iters 5000 \ --lr-decay-iters 320000 \ --save $CHECKPOINT_PATH \ --load $CHECKPOINT_PATH \ --data-path $DATA_PATH \ --vocab-file data/gpt2-vocab.json \ --merge-file data/gpt2-merges.txt \ --data-impl mmap \ --split 949,50,1 \ --distributed-backend nccl \ --lr 0.00015 \ --lr-decay-style cosine \ --min-lr 1.0e-5 \ --weight-decay 1e-2 \ --clip-grad 1.0 \ --lr-warmup-fraction .01 \ --checkpoint-activations \ --log-interval 10 \ --save-interval 500 \ --eval-interval 100 \ --eval-iters 10 \ --fp16 开始训练。 本文是单机单卡训练,使用预训练脚本参数控制: GPUS_PER_NODE=1 NNODES=1 NODE_RANK=0 执行以下命令,开始预训练。 nohup sh ./pretrain_gpt2.sh & 图3 开始预训练 实时查看训练日志,监控程序。 tail -f nohup.out 如果显示如下信息, 表示模型训练完成。 图4 模型训练完成 在训练过程中观察单GPU卡的利用率,如下: 图5 GPU利用率 查看生成的模型checkpoint。 本示例生成的模型checkpoint路径设置在“/workspace/Megatron-DeepSpeed/checkpoints/gpt2”。 ll ./checkpoints/gpt2 图6 模型checkpoint
  • Step3 单机多卡训练 和单机单卡训练相比, 单机多卡训练只需在预训练脚本中设置多卡参数相关即可, 其余步骤与单机单卡相同。 当前选择GPU裸金属服务器是8卡, 因此需要调整如下参数: GPUS_PER_NODE=8 调整全局批处理大小(global batch size)、微批处理大小(micro batch size)、数据并行大小(data_parallel_size)参数。三者的关系为:“global_batch_size”可被“micro_batch_size * data_parallel_size”整除。 本文设置的参数值如下: global_batch_size = 64 micro_batch_size = 4 data_parallel_size = 8 单机多卡完整的预训练脚本内容如下: #! /bin/bash # Runs the "345M" parameter model GPUS_PER_NODE=8 # Change for multinode config MASTER_ADDR=localhost MASTER_PORT=6000 NNODES=1 NODE_RANK=0 WORLD_SIZE=$(($GPUS_PER_NODE*$NNODES)) DATA_PATH=data/meg-gpt2_text_document CHECKPOINT_PATH=checkpoints/gpt2 DISTRIBUTED_ARGS="--nproc_per_node $GPUS_PER_NODE --nnodes $NNODES --node_rank $NODE_RANK --master_addr $MASTER_ADDR --master_port $MASTER_PORT" python -m torch.distributed.launch $DISTRIBUTED_ARGS \ pretrain_gpt.py \ --tensor-model-parallel-size 1 \ --pipeline-model-parallel-size 1 \ --num-layers 24 \ --hidden-size 1024 \ --num-attention-heads 16 \ --micro-batch-size 4 \ --global-batch-size 64 \ --seq-length 1024 \ --max-position-embeddings 1024 \ --train-iters 5000 \ --lr-decay-iters 320000 \ --save $CHECKPOINT_PATH \ --load $CHECKPOINT_PATH \ --data-path $DATA_PATH \ --vocab-file data/gpt2-vocab.json \ --merge-file data/gpt2-merges.txt \ --data-impl mmap \ --split 949,50,1 \ --distributed-backend nccl \ --lr 0.00015 \ --lr-decay-style cosine \ --min-lr 1.0e-5 \ --weight-decay 1e-2 \ --clip-grad 1.0 \ --lr-warmup-fraction .01 \ --checkpoint-activations \ --log-interval 10 \ --save-interval 500 \ --eval-interval 100 \ --eval-iters 10 \ --fp16 训练时监控的GPU利用率如下: 图7 GPU利用率
  • Step1 安装模型 安装Megatron-Deepspeed框架。 使用root用户SSH的方式登录GPU裸金属服务器,登录方式在华为云购买页面可以获取。 拉取pytorch镜像,可以选择常用的镜像源进行下载。 docker pull nvcr.io/nvidia/pytorch:21.10-py3 启动容器。 docker run -d -t --network=host --gpus all --privileged --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 --name megatron-deepspeed -v /etc/localtime:/etc/localtime -v /root/.ssh:/root/.ssh nvcr.io/nvidia/pytorch:21.10-py3 执行以下命令,进入容器终端。 docker exec -it megatron-deepspeed bash 下载Megatron-DeepSpeed框架。 git clone https://github.com/bigscience-workshop/Megatron-DeepSpeed 若git clone失败,可以尝试先下载至本地,然后拷贝至服务器中,在docker cp至容器中。 安装Megatron-DeepSpeed框架。 cd Megatron-DeepSpeed pip install -r requirements.txt -i http://mirrors.myhuaweicloud.com/pypi/web/simple --trusted-host mirrors.myhuaweicloud.com pip install mpi4py -i http://mirrors.myhuaweicloud.com/pypi/web/simple --trusted-host mirrors.myhuaweicloud.com 修改测试代码,注释掉以下文件的断言所在行。 vim /workspace/Megatron-DeepSpeed/megatron/model/fused_softmax.py +191 在“assert mask is None, "Mask is silently ignored due to the use of a custom kernel"”前加“#”,即: # assert mask is None, "Mask is silently ignored due to the use of a custom kernel" 数据集下载和预处理。 本实践中选择使用1GB 79K-record的JSON格式的OSCAR数据集。 下载数据集。 wget https://huggingface.co/bigscience/misc-test-data/resolve/main/stas/oscar-1GB.jsonl.xz wget https://s3.amazonaws.com/models.huggingface.co/bert/gpt2-vocab.json wget https://s3.amazonaws.com/models.huggingface.co/bert/gpt2-merges.txt 解压数据集。 xz -d oscar-1GB.jsonl.xz 预处理数据。 python3 tools/preprocess_data.py \ --input oscar-1GB.jsonl \ --output-prefix meg-gpt2 \ --vocab gpt2-vocab.json \ --dataset-impl mmap \ --tokenizer-type GPT2BPETokenizer \ --merge-file gpt2-merges.txt \ --append-eod \ --workers 8 若发生如下“np.float”报错,按照报错提示修改为“float”即可。 图1 预处理数据报错 数据预处理完成标识。 图2 数据预处理完成 新建data目录并移动处理好的数据。 mkdir data mv meg-gpt2* ./data mv gpt2* ./data
  • 环境准备 在华为云ModelArts Server预购相关超强算力的GPU裸金属服务器,并选择AIGC场景通用的镜像,完成使用Megatron-Deepspeed训练GPT2模型。本最佳实践使用以下镜像和规格: 镜像选择:Ubuntu 20.04 x86 64bit SDI3 for Ant8 BareMetal with RoCE and NVIDIA-525 CUDA-12.0。 裸金属规格选择: GP Ant8,包含8张GPU卡以及8张RoCE网卡。 关于Ant8裸金属服务器的购买,可以在华为云官网提工单至ModelArts云服务, 完成资源的申请。
  • 背景信息 Megatron-Deepspeed Megatron-Deepspeed是一个由NVIDIA开发的基于PyTorch的深度学习模型训练框架。它结合了两个强大的工具:Megatron-LM和DeepSpeed,可在具有分布式计算能力的系统上进行训练,并且充分利用了多个GPU和深度学习加速器的并行处理能力。可以高效地训练大规模的语言模型。 Megatron-LM是一个用于大规模语言建模的模型。它基于GPT(Generative Pre-trained Transformer)架构,这是一种基于自注意力机制的神经网络模型,广泛用于 自然语言处理 任务,如文本生成、 机器翻译 和对话系统等。 DeepSpeed是NVIDIA开源的加速深度学习训练的库。它针对大规模的模型和分布式训练进行了优化,可以显著提高训练速度和效率。DeepSpeed提供了各种技术和优化策略,包括分布式梯度下降、模型并行化、梯度累积和动态精度缩放等。它还支持优化大模型的内存使用和计算资源分配。 GPT2 GPT2(Generative Pre-trained Transformer 2),是OpenAI组织在2018年于GPT模型的基础上发布的新预训练模型,是一个基于Transformer且非常庞大的语言模型。它在大量数据集上进行了训练,直接运行一个预训练好的GPT-2模型:给定一个预定好的起始单词或者句子,可以让它自行地随机生成后续的文本。
  • 监控插件安装步骤 当前账户需要给 CES 授权委托,请参考创建用户并授权使用 云监控服务 。 当前还不支持在CES界面直接一键安装监控,需要登录到服务器上执行以下命令安装配置Agent。其它region的安装请参考单台主机下安装Agent。 cd /usr/local && curl -k -O https://obs.cn-north-4.myhuaweicloud.com/uniagent-cn-north-4/script/agent_install.sh && bash agent_install.sh 安装成功的标志如下: 图1 安装成功提示 在CES界面查看具体的监控项,加速卡类的监控项必须在主机安装加速卡驱动后才会有相关指标。 图2 监控界面 至此,监控插件已经安装完成,相关指标的采集可以在UI界面直接查看或者根据指标值配置相关告警。
  • 裸金属服务器监控介绍 监控概述请参考BMS官方文档。除文档所列支持的镜像之外,目前还支持Ubuntu20.04。 监控指标采样周期1分钟。当前监控指标项已经包含CPU、内存、磁盘、网络。在主机上安装加速卡驱动后,可以自动采集的如下指标: 表1 指标列表 指标英文名 指标中文名 说明 单位 维度 gpu_status gpu健康状态。 BMS上GPU健康状态,是一个综合指标,0代表健康,1代表亚健康,2代表故障。 - instance_id,gpu gpu_utilization gpu使用率。 该GPU的算力使用率。 % instance_id,gpu memory_utilization 显存使用率。 该GPU的显存使用率。 % instance_id,gpu gpu_performance gpu性能状态。 该GPU的性能状态。 - instance_id,gpu encoder_utilization 编码使用率。 该GPU的编码能力使用率。 % instance_id,gpu decoder_utilization 解码使用率。 该GPU的解码能力使用率。 % instance_id,gpu volatile_correctable 短期可纠正ECC错误数量。 该GPU重置以来可纠正的ECC错误数量,每次重置后归0。 个 instance_id,gpu volatile_uncorrectable 短期不可纠正ECC错误数量。 该GPU重置以来不可纠正的ECC错误数量,每次重置后归0。 个 instance_id,gpu aggregate_correctable 累计可纠正ECC错误数量。 该GPU累计的可纠正ECC错误数量。 个 instance_id,gpu aggregate_uncorrectable 累计不可纠正ECC错误数量。 该GPU累计的不可纠正ECC错误数量。 个 instance_id,gpu retired_page_single_bit retired page single bit错误数量。 retired page single bit错误数量,表示当前卡隔离的单比特页数。 个 instance_id,gpu retired_page_double_bit retired page double bit错误数量。 retired page double bit错误数量,表示当前卡隔离的双比特页的数量。 个 instance_id,gpu
  • 1、安装NVIDIA驱动 打开NVIDIA官方网站。 根据Ant8的详细信息和您所需的cuda版本选择驱动 图1 驱动选择 选择后会自动出现Driver版本并下载,或者直接。 wget https://cn.download.nvidia.com/tesla/470.182.03/NVIDIA-Linux-x86_64-470.182.03.run 添加权限。 chmod +x NVIDIA-Linux-x86_64-470.182.03.run 运行安装文件。 ./NVIDIA-Linux-x86_64-470.182.03.run 至此NVIDIA-DRIVER驱动安装完成。
  • 操作步骤 卸载原有版本的NVIDIA和CUDA。 查看使用apt包管理方式安装的nvidia软件包, 执行如下命令实现查看和卸载。 dpkg -l | grep nvidia dpkg -l | grep cuda sudo apt-get autoremove --purge nvidia-* sudo apt-get autoremove --purge cuda-* 以上命令可以卸载nvidia-driver、cuda、nvidia-fabricmanager、nvidia-peer-memory四个软件。 但是如果nvidia和cuda是使用runfile(local)方式安装的,那么需要在下一步中再次卸载。 若使用nvidia run包直接安装的驱动,需要找到对应的卸载命令。 sudo /usr/bin/nvidia-uninstall sudo /usr/local/cuda-11.7/bin/cuda-uninstaller 验证是否卸载完成。 nvidia-smi nvcc -V dpkg -l | grep peer dpkg -l | grep fabricmanager dpkg -l | grep nvidia 卸载nccl相关软件。 由于nccl和cuda是配套关系, 当cuda版本从12.0更换为11.7的时候,libnccl和libnccl-dev都需要更换为和cuda11.7匹配的版本。因此必须卸载掉原版本。 sudo apt-get autoremove --purge *nccl* 删除原nccl-test的编译后文件。 由于nccl-test make编译也是基于当前cuda12.0版本的。 当cuda版本更换后,需要重新编译, 因此删除它。默认该文件在/root/nccl-tests直接删除即可。 从内核中卸载nvidia相关的所有进程。 在安装nvidia驱动时,必须把内核中加载nvidia相关的进程卸载,否则会失败。具体操作请参考GPU裸金属服务器更换NVIDIA驱动后执行nvidia-smi提示Failed to initialize NVML。 若遇到加载到内核的nvidia进程循环依赖,无法从内核中卸载nvidia,此时执行reboot命令重启服务器即可。 安装NVIDIA-515和CUDA-11.7配套软件环境。具体步骤请参考GP Ant8裸金属服务器Ubuntu 20.04安装NVIDIA 515+CUDA 11.7。
  • 1、GPU环境安装指南 安装NVIDIA驱动。 wget https://us.download.nvidia.cn/XFree86/Linux-x86_64/470.182.03/NVIDIA-Linux-x86_64-470.182.03.run chmod +x NVIDIA-Linux-x86_64-470.182.03.run ./NVIDIA-Linux-x86_64-470.182.03.run 安装CUDA。 不能选择Driver,否则会覆盖已安装的NVIDIA驱动。 wget https://developer.download.nvidia.com/compute/cuda/11.3.1/local_installers/cuda_11.3.1_465.19.01_linux.run chmod +x cuda_11.3.1_465.19.01_linux.run ./cuda_11.3.1_465.19.01_linux.run --toolkit --samples --silent 安装nvidia-fabricmanager。 Ant系列GPU支持NvLink & NvSwitch,若您使用多GPU卡的机型,需额外安装与驱动版本对应的nvidia-fabricmanager服务使GPU卡间能够互联,否则可能无法正常使用GPU实例。 fabricmanager版本一定要和nvidia驱动版本必须保持一致。 wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/nvidia-fabricmanager-470_470.182.03-1_amd64.deb sudo dpkg -i ./nvidia-fabricmanager-470_470.182.03-1_amd64.deb 验证fabricmanager安装结果。 验证驱动安装结果、启动fabricmanager服务并查看状态。 nvidia-smi -pm 1 nvidia-smi systemctl enable nvidia-fabricmanager systemctl start nvidia-fabricmanager systemctl status nvidia-fabricmanager 汇总安装脚本。 在GP Ant8型实例中, 使用bash一键执行如下脚本,实现快速安装GPU环境。 wget https://us.download.nvidia.cn/XFree86/Linux-x86_64/470.182.03/NVIDIA-Linux-x86_64-470.182.03.run chmod +x NVIDIA-Linux-x86_64-470.182.03.run ./NVIDIA-Linux-x86_64-470.182.03.run --silent --no-questions wget https://developer.download.nvidia.com/compute/cuda/11.3.1/local_installers/cuda_11.3.1_465.19.01_linux.run chmod +x cuda_11.3.1_465.19.01_linux.run ./cuda_11.3.1_465.19.01_linux.run --toolkit --samples --silent version=470.182.03 main_version=$(echo $version | awk -F '.' '{print $1}') apt-get update apt-get -y install nvidia-fabricmanager-${main_version}=${version}-*
  • 2、pytorch2.0安装和CUDA验证指南 PyTorch2.0所需环境为Python3.10, 安装配置miniconda环境。 miniconda安装并创建alpha环境。 wget https://repo.anaconda.com/miniconda/Miniconda3-py310_23.1.0-1-Linux-x86_64.sh chmod 750 Miniconda3-py310_23.1.0-1-Linux-x86_64.sh bash Miniconda3-py310_23.1.0-1-Linux-x86_64.sh -b -p /home/miniconda export PATH=/home/miniconda/bin:$PATH conda create --quiet --yes -n alpha python=3.10 安装pytorch2.0并验证cuda状态。 在alpha环境下安装torch2.0,使用清华PIP源完成。 source activate alpha pip install torch==2.0 -i https://pypi.tuna.tsinghua.edu.cn/simple python 验证torch与cuda的安装状态,输出为True即为正常。 import torch print(torch.cuda.is_available())
  • 场景描述 本文旨在指导完成GP Ant8裸金属服务器装机和nccl-test测试。装机软件预览如下: 表1 装机软件 软件类型 版本详情 预置操作系统 Ubuntu 20.04 server 64bit 驱动版本 515.10.01 nvidia-cuda 11.7 nvidia-fabricmanager 515.10.01(必须和驱动版本保持一致) mlnx-ofed-linux 5.8-2.0.3.0/5.4-3.6.8.1(可选) nvidia-peer-memory-dkms 1.2-0 nccl libnccl2=2.14.3-1+cuda11.7 libnccl-dev=2.14.3-1+cuda11.7 nccl-test v.2.13.6
  • 操作步骤 替换apt源。 sudo sed -i "s@http://.*archive.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list sudo sed -i "s@http://.*security.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list sudo apt update 安装nvidia驱动。 wget https://us.download.nvidia.com/tesla/515.105.01/NVIDIA-Linux-x86_64-515.105.01.run chmod +x NVIDIA-Linux-x86_64-515.105.01.run ./NVIDIA-Linux-x86_64-515.105.01.run 安装cuda。 # run包安装 wget https://developer.download.nvidia.com/compute/cuda/11.7.0/local_installers/cuda_11.7.0_515.43.04_linux.run chmod +x cuda_11.7.0_515.43.04_linux.run ./cuda_11.7.0_515.43.04_linux.run --toolkit --samples --silent 安装nccl。 nccl安装可参考NCCL Documentation。 nccl和cuda版本的配套关系和安装方法参考NCL Downloads。 本文使用cuda版本是11.7,因此安装nccl的命令为: wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-keyring_1.0-1_all.deb sudo dpkg -i cuda-keyring_1.0-1_all.deb sudo apt update sudo apt install libnccl2=2.14.3-1+cuda11.7 libnccl-dev=2.14.3-1+cuda11.7 安装完成后可以查看: 图1 查看nccl 安装nvidia-fabricmanager。 nvidia-fabricmanager必须和nvidia driver版本保持一致 version=515.105.01 main_version=$(echo $version | awk -F '.' '{print $1}') apt-get update apt-get -y install nvidia-fabricmanager-${main_version}=${version}-* 验证驱动安装结果:启动fabricmanager服务并查看状态是否为“RUNNING”。 nvidia-smi -pm 1 nvidia-smi systemctl enable nvidia-fabricmanager systemctl start nvidia-fabricmanager systemctl status nvidia-fabricmanager 安装nv-peer-memory。 git clone https://github.com/Mellanox/nv_peer_memory.git cd ./nv_peer_memory ./build_module.sh cd /tmp tar xzf /tmp/nvidia-peer-memory_1.3.orig.tar.gz cd nvidia-peer-memory-1.3 dpkg-buildpackage -us -uc dpkg -i ../nvidia-peer-memory-dkms_1.2-0_all.deb nv_peer_mem工作在linux内核态,安装完成后需要看是否加载到内核,通过执行“lsmod | grep peer”查看是否加载。 如果git clone拉不下来代码,可能需要先设置下git的配置: git config --global core.compression -1 export GIT_SSL_NO_VERIFY=1 git config --global http.sslVerify false git config --global http.postBuffer 10524288000 git config --global http.lowSpeedLimit 1000 git config --global http.lowSpeedTime 1800 如果安装完成后lsmod看不到nv-peer-memory,可能是由于ib驱动版本过低导致,此时需要升级ib驱动,升级命令: wget https://content.mellanox.com/ofed/MLNX_OFED-5.4-3.6.8.1/MLNX_OFED_LINUX-5.4-3.6.8.1-ubuntu20.04-x86_64.tgz tar -zxvf MLNX_OFED_LINUX-5.4-3.6.8.1-ubuntu20.04-x86_64.tgz cd MLNX_OFED_LINUX-5.4-3.6.8.1-ubuntu20.04-x86_64 apt-get install -y python3 gcc quilt build-essential bzip2 dh-python pkg-config dh-autoreconf python3-distutils debhelper make ./mlnxofedinstall --add-kernel-support 如果想安装其它更高版本的ib驱动,请参考Linux InfiniBand Drivers。比如要安装MLNX_OFED-5.8-2.0.3.0 (当前最新版本),则命令为: wget https://content.mellanox.com/ofed/MLNX_OFED-5.8-2.0.3.0/MLNX_OFED_LINUX-5.8-2.0.3.0-ubuntu20.04-x86_64.tgz tar -zxvf MLNX_OFED_LINUX-5.8-2.0.3.0-ubuntu20.04-x86_64.tgz cd MLNX_OFED_LINUX-5.8-2.0.3.0-ubuntu20.04-x86_64 apt-get install -y python3 gcc quilt build-essential bzip2 dh-python pkg-config dh-autoreconf python3-distutils debhelper make ./mlnxofedinstall --add-kernel-support 安装完nv_peer_mem, 如果想查看其状态可以输入如下指令: /etc/init.d/nv_peer_mem/ status 如果发现没有此文件,则可能安装的时候没有默认拷贝过来,需要拷贝即可: cp /tmp/nvidia-peer-memory-1.3/nv_peer_mem.conf /etc/infiniband/ cp /tmp/nvidia-peer-memory-1.3/debian/tmp/etc/init.d/nv_peer_mem /etc/init.d/ 设置环境变量。 MPI路径版本需要匹配,可以通过“ls /usr/mpi/gcc/”查看openmpi的具体版本。 # 加入到~/.bashrc export LD_LIBRARY_PATH=/usr/local/cuda/lib:usr/local/cuda/lib64:/usr/include/nccl.h:/usr/mpi/gcc/openmpi-4.1.2a1/lib:$LD_LIBRARY_PATH export PATH=$PATH:/usr/local/cuda/bin:/usr/mpi/gcc/openmpi-4.1.2a1/bin 安装编译nccl-test。 cd /root git clone https://github.com/NVIDIA/nccl-tests.git cd ./nccl-tests make MPI=1 MPI_HOME=/usr/mpi/gcc/openmpi-4.1.2a1 -j 8 编译时需要加上MPI=1的参数,否则无法进行多机之间的测试。 MPI路径版本需要匹配,可以通过“ls /usr/mpi/gcc/”查看openmpi的具体版本。 测试。 单机测试: /root/nccl-tests/build/all_reduce_perf -b 8 -e 1024M -f 2 -g 8 多机测试: mpirun --allow-run-as-root --hostfile hostfile -mca btl_tcp_if_include eth0 -mca btl_openib_allow_ib true -x NCCL_DEBUG=INFO -x NCCL_IB_GID_INDEX=3 -x NCCL_IB_TC=128 -x NCCL_ALGO=RING -x NCCL_IB_HCA=^mlx5_bond_0 -x LD_LIBRARY_PATH /root/nccl-tests/build/all_reduce_perf -b 8 -e 11g -f 2 -g 8 hostfile格式: #主机私有IP 单节点进程数 192.168.20.1 slots=1 192.168.20.2 slots=1 需要执行mpirun的节点到hostfile中的节点间有免密登录(如何设置SSH免密登录)。 btl_tcp_if_include后面替换为主网卡名称。 NCCL环境变量: NCCL_IB_GID_INDEX=3 :数据包走交换机的队列4通道,这是RoCE协议标准。 NCCL_IB_TC=128 :使用RoCE v2协议,默认使用RoCE v1,但是v1在交换机上没有拥塞控制,可能丢包,而且后面的交换机不会支持v1,就跑不起来了。 NCCL_ALGO=RING :nccl_test的总线bandwidth是在假定是Ring算法的情况下计算出来的。 计算公式是有假设的: 总线带宽 = 算法带宽 * 2 ( N-1 ) / N ,算法带宽 = 数据量 / 时间 但是这个计算公式的前提是用Ring算法,Tree算法的总线带宽不能这么算。 如果Tree算法算出来的总线带宽相当于是相对Ring算法的性能加速。 算法计算总耗时减少了,所以用公式算出来的总线带宽也增加了。 理论上Tree算法是比Ring算法更优的,但是Tree算法对网络的要求比Ring高,计算可能不太稳定。 Tree算法可以用更少的数据通信量完成all reduce计算,但用来测试性能不太合适。 因此,会出现两节点实际带宽100,但测试出速度110,甚至130GB/s的情况。 加这个参数以后,2节点和2节点以上情况的速度才会稳定一些。
  • 场景描述 本文旨在指导完成GP Ant8裸金属服务器装机和nccl-test测试。装机软件预览如下: 表1 装机软件 软件类型 版本详情 预置操作系统 Ubuntu 20.04 server 64bit 驱动版本 525.105.17 nvidia-cuda 12.0 nvidia-fabricmanager 515.10.17(必须和驱动版本保持一致) mlnx-ofed-linux 5.8-2.0.3.0/5.4-3.6.8.1(可选) nvidia-peer-memory-dkms 1.2-0 nccl libnccl2=2.16.2-1+cuda12.0 libnccl-dev=2.16.2-1+cuda12.0 nccl-test v.2.13.6
共100000条