华为云用户手册

  • 创建模型 使用大模型创建模型,选择从 对象存储服务 (OBS)中导入,需满足以下参数配置: 采用自定义引擎,开启动态加载 使用大模型要求用户使用自定义引擎,并开启动态加载的模式导入模型。用户可以制作自定义引擎,满足大模型场景下对镜像依赖包、推理框架等的特殊需求。自定义引擎的制作请参考使用自定义引擎在ModelArts Standard创建模型。 当用户使用自定义引擎时,默认开启动态加载,模型包与镜像分离,在服务部署时动态将模型加载到服务负载。 配置健康检查 大模型场景下导入的模型,要求配置健康检查,避免在部署时服务显示已启动但实际不可用。 图3 采用自定义引擎,开启动态加载并配置健康检查示例图
  • 部署在线服务 部署服务时,需满足以下参数配置: 自定义部署超时时间 大模型加载启动的时间一般大于普通的模型创建的服务,请配置合理的“部署超时时间”,避免尚未启动完成被认为超时而导致部署失败。 添加环境变量 部署服务时,增加如下环境变量,会将负载均衡的请求亲和策略配置为集群亲和,避免未就绪的服务实例影响预测成功率。 MODELARTS_SERVICE_TRAFFIC_POLICY: cluster 图4 自定义部署超时时间和添加环境变量示例图 建议部署多实例,增加服务可靠性。
  • 申请扩大模型的大小配额和使用节点本地存储缓存白名单 服务部署时,默认情况下,动态加载的模型包位于临时磁盘空间,服务停止时已加载的文件会被删除,再次启动时需要重新加载。为了避免反复加载,平台允许使用资源池节点的本地存储空间来加载模型包,并在服务停止和重启时仍有效(通过哈希值保证数据一致性) 使用大模型要求用户采用自定义引擎,并开启动态加载的模式导入模型。基于此,需要执行以下操作: 如果模型超过默认配额值,需要提工单申请扩大单个模型的大小配额。单个模型大小配额默认值为20GB。 需要提工单申请添加使用节点本地存储缓存的白名单。
  • 上传模型数据并校验上传对象的一致性 为了动态加载时保证数据完整性,需要在上传模型数据至OBS时,进行上传对象的一致性校验。obsutil、OBS Browser+以及OBS SDK都支持在上传对象时进行一致性校验,您可以根据自己的业务选择任意一种方式进行校验。详见校验上传对象的一致性。 以OBS Browser+为例,如图1。使用OBS Browser+上传数据,开启MD5校验,动态加载并使用节点本地的持久化存储时,检查数据一致性。 图1 OBS Browser+配置MD5校验
  • 多模态模型 ModelArts针对以下主流的多模态模型进行了基于昇腾NPU的适配工作,可以直接使用适配过的模型在NPU上进行推理或训练。 表4 多模态模型基于Ascend-vLLM框架的推理 支持模型 支持模型参数量 应用场景 软件技术栈 指导文档 internVL2 internVL2-8B internVL2-26B internVL2-40B internVL2-Llama3-76B 推理 Ascend-vLLM 主流开源大模型基于Lite Server适配Ascend-vLLM PyTorch NPU推理指导(6.3.912) 主流开源大模型基于Standard适配PyTorch NPU推理指导(6.3.911) 主流开源大模型基于Lite Cluster适配PyTorch NPU推理指导(6.3.911) MiniCPM MiniCPM-v2.6 推理 Ascend-vLLM qwen2-vl qwen2-vl-2B qwen2-vl-7B qwen2-vl-72B 推理 Ascend-vLLM llava llava-1.5-7b llava-1.5-13b llava-v1.6-7b llava-v1.6-13b llava-v1.6-34b 推理 Ascend-vLLM llava-onevision-qwen2 llava-onevision-qwen2-0.5b-ov-hf llava-onevision-qwen2-7b-ov-hf 推理 Ascend-vLLM 表5 多模态模型基于PyTorch的训练推理 模型名称 应用场景 软件技术栈 指导文档 Qwen-VL 训练 推理 PyTorch 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 训练 PyTorch MiniCPM-V2.6基于Lite Server适配PyTorch NPU训练指导(6.3.912) MiniCPM-V2.0 训练 推理 PyTorch MiniCPM-V2.0推理及LoRA微调基于Lite Server适配PyTorch NPU指导(6.3.910) InternVL2 训练 PyTorch InternVL2基于LIte Server适配PyTorch NPU训练指导(6.3.912) LLaVA-NeXT 训练 PyTorch LLaVA-NeXT基于Lite Server适配PyTorch NPU训练微调指导(6.3.912) LLaVA 训练 推理 PyTorch LLaVA模型基于Lite Server适配PyTorch NPU预训练指导(6.3.912) LLaVA模型基于Lite Server适配PyTorch NPU推理指导(6.3.906) LLama 3.2-Vision 训练 PyTorch Llama 3.2-Vision基于Lite Server适配Pytorch NPU训练微调指导(6.3.912) LLaMA-VID 推理 PyTorch LLaMA-VID基于Lite Server适配PyTorch NPU推理指导(6.3.910) moondream2 推理 PyTorch moondream2基于Lite Server适配PyTorch NPU推理指导
  • 使用镜像创建模型 登录ModelArts管理控制台,进入“ 模型管理”页面,单击“创建”,跳转至创建模型页面。 完成模型配置,部分配置如下: 元模型来源:选择“从容器镜像中选择”。 容器镜像所在的路径:选择上传镜像至 容器镜像服务 上传的路径。 容器调用接口:根据实际情况配置容器调用接口。 健康检查:保持默认。如果镜像中配置了健康检查则按实际情况配置健康检查。 图1 模型配置参数 单击“立即创建”,进入模型列表页,等模型状态变为“正常”,表示模型创建成功。
  • 背景说明 WebSocket是一种网络传输协议,可在单个TCP连接上进行全双工通信,位于OSI模型的应用层。WebSocket协议在2011年由IETF标准化为RFC 6455,后由RFC 7936补充规范。Web IDL中的WebSocket API由W3C标准化。 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以建立持久性的连接,并进行双向数据传输。
  • 背景说明 访问在线服务的实际业务中,用户可能会存在如下需求: 高吞吐量、低时延 TCP或者RPC请求 因此,ModelArts提供了VPC直连的高速访问通道功能以满足用户的需求。 使用VPC直连的高速访问通道,用户的业务请求不需要经过推理平台,而是直接经VPC对等连接发送到实例处理,访问速度更快。 由于请求不经过推理平台,所以会丢失以下功能: 认证鉴权 流量按配置分发 负载均衡 告警、监控和统计 图1 VPC直连的高速访问通道示意图
  • 在本地机器调试 自定义引擎的规范可以在安装有docker的本地机器上通过以下步骤提前验证: 将自定义引擎镜像下载至本地机器,假设镜像名为custom_engine:v1。 将模型包文件夹复制到本地机器,假设模型包文件夹名字为model。 在模型包文件夹的同级目录下验证如下命令拉起服务: docker run --user 1000:100 -p 8080:8080 -v model:/home/mind/model custom_engine:v1 该指令无法完全模拟线上,主要是由于-v挂载进去的目录是root权限。在线上,模型文件从OBS下载到/home/mind/model目录之后,文件owner将统一修改为ma-user。 在本地机器上启动另一个终端,执行以下验证指令,得到符合预期的推理结果。 curl https://127.0.0.1:8080/${推理服务的请求路径}
  • https示例 使用Flask启动https,Webserver代码示例如下: from flask import Flask, request import json app = Flask(__name__) @app.route('/greet', methods=['POST']) def say_hello_func(): print("----------- in hello func ----------") data = json.loads(request.get_data(as_text=True)) print(data) username = data['name'] rsp_msg = 'Hello, {}!'.format(username) return json.dumps({"response":rsp_msg}, indent=4) @app.route('/goodbye', methods=['GET']) def say_goodbye_func(): print("----------- in goodbye func ----------") return '\nGoodbye!\n' @app.route('/', methods=['POST']) def default_func(): print("----------- in default func ----------") data = json.loads(request.get_data(as_text=True)) return '\n called default func !\n {} \n'.format(str(data)) @app.route('/health', methods=['GET']) def healthy(): return "{\"status\": \"OK\"}" # host must be "0.0.0.0", port must be 8080 if __name__ == '__main__': app.run(host="0.0.0.0", port=8080, ssl_context='adhoc')
  • 方案概述 推理服务的端到端运维流程 算法开发阶段,先将业务AI数据存放到对象存储服务(OBS)中,接着通过ModelArts数据管理进行标注和版本管理,然后通过训练获得AI模型结果,最后通过开发环境构建模型镜像。 服务运维阶段,先利用镜像构建模型,接着部署模型为在线服务,然后可在 云监控服务 CES )中获得ModelArts推理在线服务的监控数据,最后可配置告警规则实现实时告警通知。 业务运行阶段,先将业务系统对接在线服务请求,然后进行业务逻辑处理和监控设置。 图1 推理服务的端到端运维流程图 整个运维过程会对服务请求失败和资源占用过高的场景进行监控,当超过阈值时发送告警通知。 图2 监控告警流程图 方案优势 通过端到端的服务运维配置,可方便地查看业务运行高低峰情况,并能够实时感知在线服务的健康状态。 约束限制 端到端服务运维只支持在线服务,因为推理的批量服务和边缘服务无CES监控数据,不支持完整的端到端服务运维设置。
  • 步骤三:设置DNS代理和调用公网地址 在自定义模型镜像时设置代理指向代理服务器私有IP和端口,如下所示。 proxies = { "http": "http://{proxy_server_private_ip}:3128", "https": "http://{proxy_server_private_ip}:3128" } 代理服务器IP即步骤二:使用Docker安装和配置正向代理中创建的E CS 私有IP,获取方式请见查看弹性云服务器详细信息。 图4 ECS私有IP 调用公网地址时,使用服务URL进行业务请求,如: https://e8a048ce25136addbbac23ce6132a.apig.cn-east-3.huaweicloudapis.com
  • 步骤二:使用Docker安装和配置正向代理 购买弹性 云服务器ECS ,详情请见购买ECS。镜像可选择Ubuntu最新版本。虚拟私有云选择提前创建好的VPC。 申请弹性公网IP EIP,详情请见申请弹性公网IP。 将弹性公网IP绑定到ECS,详情请见将弹性公网IP绑定至实例。 登录ECS,执行如下命令进行Docker安装。如已安装,请直接进入下一步。 curl -sSL https://get.daocloud.io/docker | sh 执行如下命令安装Squid容器。 docker pull ubuntu/squid 创建主机目录。 mkdir –p /etc/squid/ 打开并配置whitelist.conf文件。 vim whitelist.conf 配置内容为安全控制可访问的地址,支持配置通配符,例如: .apig.cn-east-3.huaweicloudapis.com 如果地址访问不通,请在浏览器配置访问 域名 。 打开并配置squid.conf文件。 vim squid.conf 配置内容如下。 # An ACL named 'whitelist' acl whitelist dstdomain '/etc/squid/whitelist.conf' # Allow whitelisted URLs through http_access allow whitelist # Block the rest http_access deny all # Default port http_port 3128 设置主机目录和配置文件权限如下。 chmod 640 -R /etc/squid 执行如下命令启动Squid实例。 docker run -d --name squid -e TZ=UTC -v /etc/squid:/etc/squid -p 3128:3128 ubuntu/squid:latest 进入docker刷新Squid。 docker exec –it squid bash root@{container_id}:/# squid -k reconfigure
  • Step1 创建OBS桶和文件夹 在OBS服务中创建桶和文件夹,用于存放样例数据集以及训练代码。需要创建的文件夹列表如表1所示,示例中的桶名称“test-modelarts” 和文件夹名称均为举例,请替换为用户自定义的名称。 创建OBS桶和文件夹的操作指导请参见创建桶。 请确保您使用的OBS与ModelArts在同一区域。 表1 OBS桶文件夹列表 文件夹名称 用途 “obs://test-modelarts/mpi/demo-code/” 用于存储MPI启动脚本与训练脚本文件。 “obs://test-modelarts/mpi/log/” 用于存储训练日志文件。
  • Step2 准备训练脚本并上传至OBS 准备本案例所需的训练脚本“pytorch-verification.py”文件,并上传至OBS桶的“obs://test-modelarts/pytorch/demo-code/”文件夹下。 “pytorch-verification.py”文件内容如下: import torch import torch.nn as nn x = torch.randn(5, 3) print(x) available_dev = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") y = torch.randn(5, 3).to(available_dev) print(y)
  • Step5 上传镜像至SWR服务 登录容器 镜像服务 控制台,选择区域,要和ModelArts区域保持一致,否则无法选择到镜像。 单击右上角“创建组织”,输入组织名称完成组织创建。请自定义组织名称,本示例使用“deep-learning”,下面的命令中涉及到组织名称“deep-learning”也请替换为自定义的值。 单击右上角“登录指令”,获取登录访问指令,本文选择复制临时登录指令。 以root用户登录本地环境,输入复制的SWR临时登录指令。 上传镜像至容器镜像服务镜像仓库。 使用docker tag命令给上传镜像打标签。 #region和domain信息请替换为实际值,组织名称deep-learning也请替换为自定义的值。 sudo docker tag pytorch:1.8.1-cuda11.1 swr.{region-id}.{domain}/deep-learning/pytorch:1.8.1-cuda11.1 #此处以华为云cn-north-4为例 sudo docker tag pytorch:1.8.1-cuda11.1 swr.cn-north-4.myhuaweicloud.com/deep-learning/pytorch:1.8.1-cuda11.1 使用docker push命令上传镜像。 #region和domain信息请替换为实际值,组织名称deep-learning也请替换为自定义的值。 sudo docker push swr.{region-id}.{domain}/deep-learning/pytorch:1.8.1-cuda11.1 #此处以华为云cn-north-4为例 sudo docker push swr.cn-north-4.myhuaweicloud.com/deep-learning/pytorch:1.8.1-cuda11.1 完成镜像上传后,在容器镜像服务控制台的“我的镜像”页面可查看已上传的 自定义镜像 。 “swr.cn-north-4.myhuaweicloud.com/deep-learning/pytorch:1.8.1-cuda11.1”即为此自定义镜像的“SWR_URL”。
  • Step1 创建OBS桶和文件夹 在OBS服务中创建桶和文件夹,用于存放样例数据集以及训练代码。需要创建的文件夹列表如表1所示,示例中的桶名称“test-modelarts”和文件夹名称均为举例,请替换为用户自定义的名称。 创建OBS桶和文件夹的操作指导请参见创建桶。 请确保您使用的OBS与ModelArts在同一区域。 表1 OBS桶文件夹列表 文件夹名称 用途 “obs://test-modelarts/pytorch/demo-code/” 用于存储训练脚本文件。 “obs://test-modelarts/pytorch/log/” 用于存储训练日志文件。
  • 环境准备 在华为云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云服务, 完成资源的申请。
  • 步骤3 单机多卡训练 和单机单卡训练相比, 单机多卡训练只需在预训练脚本中设置多卡参数相关即可, 其余步骤与单机单卡相同。 当前选择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利用率
  • 步骤1 安装模型 安装Megatron-DeepSpeed框架。 使用root用户SSH的方式登录GPU裸金属服务器。具体登录方式请参见SSH密钥方式登录裸金属服务器。 拉取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
  • 步骤2 单机单卡训练 本小节使用上文的服务器环境和安装好的模型, 使用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
  • 背景信息 Megatron-DeepSpeed Megatron-DeepSpeed是一个基于PyTorch的深度学习模型训练框架。它结合了两个强大的工具:Megatron-LM和DeepSpeed,可在具有分布式计算能力的系统上进行训练,并且充分利用了多个GPU和深度学习加速器的并行处理能力。可以高效地训练大规模的语言模型。 Megatron-LM是一个用于大规模语言建模的模型。它基于GPT(Generative Pre-trained Transformer)架构,这是一种基于自注意力机制的神经网络模型,广泛用于 自然语言处理 任务,如文本生成、 机器翻译 和对话系统等。 DeepSpeed是开源的加速深度学习训练的库。它针对大规模的模型和分布式训练进行了优化,可以显著提高训练速度和效率。DeepSpeed提供了各种技术和优化策略,包括分布式梯度下降、模型并行化、梯度累积和动态精度缩放等。它还支持优化大模型的内存使用和计算资源分配。 GPT2 GPT2(Generative Pre-trained Transformer 2),是OpenAI组织在2018年于GPT模型的基础上发布的新预训练模型,是一个基于Transformer且非常庞大的语言模型。它在大量数据集上进行了训练,直接运行一个预训练好的GPT-2模型:给定一个预定好的起始单词或者句子,可以让它自行地随机生成后续的文本。
  • Python封装API方式切换操作系统 以下为BMS使用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控制台切换操作系统 获取操作系统镜像。 由华为云官方提供给客户操作系统镜像,在IMS镜像服务的共享镜像处进行接收即可,参考如下图操作。 图1 共享镜像 切换操作系统。 对Lite Server资源对应的裸金属服务器,对其进行关机操作,完成关机后,才可以执行切换操作系统动作。 在裸金属服务的更多选项中,单击切换操作系统,如下图所示。 图2 切换操作系统 在切换操作系统界面,选择上一步接收到的共享镜像即可。
  • 场景描述 Lite Server为一台弹性裸金属服务器,您可以使用BMS服务提供的切换操作系统功能,对Lite Server资源操作系统进行切换。本文介绍以下几种切换操作系统的方式: 在BMS控制台切换操作系统 使用BMS Go SDK的方式切换操作系统 使用Python封装API的方式切换操作系统 切换操作系统需满足以下条件: 当前裸金属服务器状态为停止状态。 目标操作系统必须是该Region下的IMS公共镜像或者私有共享镜像。
  • 使用BMS Go SDK的方式切换操作系统 以下为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) } }
  • GP Ant8裸金属服务器Ubuntu 20.04安装NVIDIA 515+CUDA 11.7 本小节旨在指导如何在GP Ant8裸金属服务器上(Ubuntu 20.04系统),安装NVIDIA驱动版本515、CUDA版本11.7、nvidia-fabricmanager版本515,并进行nccl-test测试。 替换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 安装完成后可以查看: 图5 查看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的具体版本。 nccl-test测试。 单机测试: /root/nccl-tests/build/all_reduce_perf -b 8 -e 1024M -f 2 -g 8 多机测试(btl_tcp_if_include后面替换为主网卡名称): 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 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节点以上情况的速度才会稳定一些。 测试时需要执行mpirun的节点到hostfile中的节点间有免密登录,设置SSH免密登录方法如下: 客户端生成公私钥。 执行如下命令,在本地客户端生成公私钥(一路回车默认即可)。 ssh-keygen 上面这个命令会在用户目录.ssh文件夹下创建“id_rsa.pub”(公钥)和“id_rsa”(私钥),可通过如下命令查看: cd ~/.ssh 上传公钥到服务器。 例如用户名为root,服务器地址为192.168.222.213,则将公钥上传至服务器的命令如下: ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.222.213 通过如下命令可以看到客户端写入到服务器的id_rsa.pub (公钥)内容: cd ~/.ssh vim authorized_keys 测试免密登录。 客户端通过ssh连接远程服务器,即可免密登录。 ssh root@192.168.222.213
  • GP Vnt1裸金属服务器Ubuntu18.04安装NVIDIA 515+CUDA 11.7 本小节旨在指导如何在GP Vnt1裸金属服务器上(Ubuntu 18.04系统),安装NVIDIA驱动版本515、CUDA版本11.7和Docker。 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安装。 wget https://developer.download.nvidia.com/compute/cuda/11.7.1/local_installers/cuda_11.7.1_515.65.01_linux.run chmod +x cuda_11.7.1_515.65.01_linux.run ./cuda_11.7.1_515.65.01_linux.run --toolkit --samples –silent 安装Docker。 curl https://get.docker.com | sh && sudo systemctl --now enable docker 安装NIVDIA容器插件。 distribution=$(. /etc/os-release;echo $ID$VERSION_ID) && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list apt-get update apt-get install -y nvidia-container-toolkit nvidia-ctk runtime configure --runtime=docker systemctl restart docker 验证Docker模式环境是否安装成功。 基于PyTorch2.0镜像验证(本案例中镜像较大,拉取时间可能较长)。 docker run -ti --runtime=nvidia --gpus all pytorch/pytorch:2.0.0-cuda11.7-cudnn8-devel bash 图4 成功拉取镜像
  • 场景描述 本文旨在指导如何在GPU裸金属服务器上,安装NVIDIA、CUDA驱动等环境配置。由于不同GPU预置镜像中预安装的软件不同,您通过Lite Server算力资源和镜像版本配套关系章节查看已安装的软件。下面为常见的软件安装步骤,您可针对需要安装的软件查看对应的内容: 安装NVIDIA驱动 安装CUDA驱动 安装Docker 安装nvidia-fabricmanager 以下提供常见的配置场景,您可查看相关文档方便您快速配置: GP Vnt1裸金属服务器EulerOS 2.9安装NVIDIA 515+CUDA 11.7 GP Vnt1裸金属服务器Ubuntu 18.04安装NVIDIA 470+CUDA 11.4 GP Vnt1裸金属服务器Ubuntu18.04安装NVIDIA 515+CUDA 11.7 GP Ant8裸金属服务器Ubuntu 20.04安装NVIDIA 515+CUDA 11.7
  • 安装Docker 部分Vnt1裸金属服务器的预置镜像中未安装Docker,您可参考以下步骤进行安装。 安装Docker。 curl https://get.docker.com | sh && sudo systemctl --now enable docker 安装NIVDIA容器插件。 distribution=$(. /etc/os-release;echo $ID$VERSION_ID) && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list apt-get update apt-get install -y nvidia-container-toolkit nvidia-ctk runtime configure --runtime=docker systemctl restart docker 验证Docker模式环境是否安装成功。 基于PyTorch2.0镜像验证(本案例中镜像较大,拉取时间可能较长)。 docker run -ti --runtime=nvidia --gpus all pytorch/pytorch:2.0.0-cuda11.7-cudnn8-devel bash 图3 成功拉取镜像
共100000条