基于云主机的ModelArts模型训练实践,让开发环境化繁为简
本文分享自华为云社区《【开发者空间实践】云主机安装Docker并制作自定义镜像在ModelArts平台做模型训练》,作者: 开发者空间小蜜蜂。
1.1 案例介绍
在AI业务开发以及运行的过程中,一般都会有复杂的环境依赖需要进行调测并固化。面对开发中的开发环境的脆弱和多轨切换问题,在ModelArts的AI开发最佳实践中,通过容器镜像的方式将运行环境进行固化,以这种方式不仅能够进行依赖管理,而且可以方便的完成工作环境切换。配合ModelArts提供的云化容器资源使用,可以更加快速、高效的进行AI开发与模型实验的迭代等。
本案例将指导开发者如何在云主机上安装Docker制作一个自定义模型镜像并在ModelArts平台使用这个镜像作模型训练。
1.2 免费领取云主机
如您还没有云主机,可点击链接,领取专属云主机后进行操作。
如您已领取云主机,可直接开始实验。
1.3 实验流程

说明:
在云主机上安装docker;
制作模型训练镜像并上传到SWR;
在云主机创建训练脚本,使用浏览器打开OBS服务,上传训练脚本;
在ModelArts平台创建训练作业完成模型训练。
1.4 实验资源
本次实验花费总计约1元,资源采取按需计费,点击链接,可根据步骤加入华为云沃土云创计划,申领云资源代金券,即可免费体验。体验结束后,请及时释放资源,避免产生多余费用,给您带来不便。

1.5 在云主机安装Docker
进入云主机后,点击左面菜单的“终端”按钮,打开命令行工具。


在命令行中输入以下命令安装Docker:
curl -fsSL get.docker.com -o get-docker.sh
	sh get-docker.sh
输入命令“sudo docker info” 确认Docker已经安装完毕。

接下来需要配置镜像加速,输入命令“vim /etc/docker/daemon.json”编辑docker配置文件,单击“i”键进入插入模式,然后输入以下内容,
{
"registry-mirrors": [ "https://a3cc4b6f1d0747bda78ca8d86e4c5419.mirror.swr.myhuaweicloud.com" ]
}
输入完成后,按“Esc”退出插入模式,再输入“:wq”保存文件,再输入“sudo systemctl restart docker”命令重启docker,然后输入命令“sudo docker info”查看,显示如下信息则表示镜像加速配置完成。

1.6 准备制作镜像的必要文件
确认安装好Docker以后,在当前目录使用命令“mkdir -p context”创建文件夹
使用“cd context/”命令进入context文件夹。

使用“vim pip.conf”命令编辑pip源文件pip.conf ,单击“i”键进入插入模式,输入如下内容,确认无误后单击ESC回到命令模式,使用“:wq”命令保存退出。
[global]
index-url = https://repo.huaweicloud.com/repository/pypi/simple
trusted-host = repo.huaweicloud.com
timeout = 120

使用wget命令下载“torch*.whl ”文件,一共三个文件
wget https://download.pytorch.org/whl/cu111/torch-1.8.1%2Bcu111-cp37-cp37m-linux_x86_64.whl
wget https://download.pytorch.org/whl/torchaudio-0.8.1-cp37-cp37m-linux_x86_64.whl
wget https://download.pytorch.org/whl/cu111/torchvision-0.9.1%2Bcu111-cp37-cp37m-linux_x86_64.whl

使用“wget https://repo.anaconda.com/miniconda/Miniconda3-py37_4.12.0-Linux-x86_64.sh”命令,下载Miniconda3 py37 4.12.0安装文件

将上述pip源文件、torch*.whl文件、Miniconda3安装文件放置在context文件夹内,完成上述操作后context文件夹内容如下。
context
├── Miniconda3-py37_4.12.0-Linux-x86_64.sh
├── pip.conf
├── torch-1.8.1+cu111-cp37-cp37m-linux_x86_64.whl
├── torchaudio-0.8.1-cp37-cp37m-linux_x86_64.whl
└── torchvision-0.9.1+cu111-cp37-cp37m-linux_x86_64.whl

使用“vim Dockerfile”创建编辑Dockerfile文件,填入以下内容
# 容器镜像构建主机需要连通公网
# 基础容器镜像, https://github.com/NVIDIA/nvidia-docker/wiki/CUDA
#
# https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds
# require Docker Engine >= 17.05
#
# builder stage
FROM nvidia/cuda:11.1.1-runtime-ubuntu18.04 AS builder
# 基础容器镜像的默认用户已经是 root
# USER root
# 使用华为开源镜像站提供的 pypi 配置
RUN mkdir -p /root/.pip/
COPY pip.conf /root/.pip/pip.conf
# 复制待安装文件到基础容器镜像中的 /tmp 目录
COPY Miniconda3-py37_4.12.0-Linux-x86_64.sh /tmp
COPY torch-1.8.1+cu111-cp37-cp37m-linux_x86_64.whl /tmp
COPY torchvision-0.9.1+cu111-cp37-cp37m-linux_x86_64.whl /tmp
COPY torchaudio-0.8.1-cp37-cp37m-linux_x86_64.whl /tmp
# https://conda.io/projects/conda/en/latest/user-guide/install/linux.html#installing-on-linux
# 安装 Miniconda3 到基础容器镜像的 /home/ma-user/miniconda3 目录中
RUN bash /tmp/Miniconda3-py37_4.12.0-Linux-x86_64.sh -b -p /home/ma-user/miniconda3
# 使用 Miniconda3 默认 python 环境 (即 /home/ma-user/miniconda3/bin/pip) 安装 torch*.whl
RUN cd /tmp && \
    /home/ma-user/miniconda3/bin/pip install --no-cache-dir \
    /tmp/torch-1.8.1+cu111-cp37-cp37m-linux_x86_64.whl \
    /tmp/torchvision-0.9.1+cu111-cp37-cp37m-linux_x86_64.whl \
    /tmp/torchaudio-0.8.1-cp37-cp37m-linux_x86_64.whl
# 构建最终容器镜像
FROM nvidia/cuda:11.1.1-runtime-ubuntu18.04
# 安装 vim和curl 工具(依然使用华为开源镜像站)
RUN cp -a /etc/apt/sources.list /etc/apt/sources.list.bak && \
    sed -i "s@http://.*archive.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list && \
    sed -i "s@http://.*security.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list && \
    apt-get update && \
    apt-get install -y vim curl && \
    apt-get clean && \
    mv /etc/apt/sources.list.bak /etc/apt/sources.list
# 增加 ma-user 用户 (uid = 1000, gid = 100)
# 注意到基础容器镜像已存在 gid = 100 的组,因此 ma-user 用户可直接使用
RUN useradd -m -d /home/ma-user -s /bin/bash -g 100 -u 1000 ma-user
# 从上述 builder stage 中复制 /home/ma-user/miniconda3 目录到当前容器镜像的同名目录
COPY --chown=ma-user:100 --from=builder /home/ma-user/miniconda3 /home/ma-user/miniconda3
# 设置容器镜像预置环境变量
# 请务必设置 PYTHONUNBUFFERED=1, 以免日志丢失
ENV PATH=$PATH:/home/ma-user/miniconda3/bin \
    PYTHONUNBUFFERED=1
# 设置容器镜像默认用户与工作目录
USER ma-user
WORKDIR /home/ma-user

完成编辑后,按“Esc”键退出编辑模式,输入“:wq”命令保存文件。完成操作后,使用“ll”命令查看context文件夹内容如下
context
├── Dockerfile
├── Miniconda3-py37_4.12.0-Linux-x86_64.sh
├── pip.conf
├── torch-1.8.1+cu111-cp37-cp37m-linux_x86_64.whl
├── torchaudio-0.8.1-cp37-cp37m-linux_x86_64.whl
└── torchvision-0.9.1+cu111-cp37-cp37m-linux_x86_64.whl
1.7 制作镜像并上传SWR
在context文件夹下,输入“sudo docker build . -t pytorch:1.8.1-cuda11.1”命令构建镜像。

此过程需要5-8分钟,可以先进行下面的步骤。
打开火狐浏览器,进入华为云首页,依次选择“产品”>“容器”>“容器镜像服务SWR”,进入服务页面,然后点击“控制台”进入SWR控制台页面。


点击右上角的“创建组织”按钮,输入组织名,点击“确定”。如果已经有可用的组织,此步骤可以跳过。


然后回到总览页面,点击上方的“登录指令”按钮,复制弹出的docker命令,在此命令前面加上“sudo ”然后在云主机的终端命令行输入,显示“Login Succeeded”则表示登录成功。


使用下列命令给新做好的镜像打标签
sudo docker tag pytorch:1.8.1-cuda11.1 swr.{区域参数}/{组织名称}/pytorch:1.8.1-cuda11.1
区域参数从登录指令中获取,如下图红框所示,组织名称也请替换为上面步骤创建的组织名。此处以华为云 华南-广州区为例

sudo docker tag pytorch:1.8.1-cuda11.1 swr.cn-south-1.myhuaweicloud.com/ai-test/pytorch:1.8.1-cuda11.1
使用下列命令将镜像上传到SWR
sudo docker push swr.{区域参数}/{组织名称}/pytorch:1.8.1-cuda11.1
区域参数从登录指令中获取,如下图红框所示,组织名称也请替换为上面步骤创建的组织名。此处以华为云 华南-广州区为例

sudo docker push swr.cn-south-1.myhuaweicloud.com/ai-test/pytorch:1.8.1-cuda11.1

完成镜像上传后,在容器镜像服务控制台的“我的镜像”页面可查看已上传的自定义镜像。

1.8 创建OBS桶和文件夹并上传训练脚本
在华为云首页,依次选择“产品”>“存储”>“对象存储服务OBS”,进入服务页面,然后点击“购买”进入资源包购买页面。

按照如下规格购买:




购买完成后,在控制台页面左面的菜单中,点击“桶列表”。

然后点击右上角“创建桶”按钮,进入创建页面,
按照如下规格创建:




创建好桶后,就可以在桶列表页面看到,点击桶的名称链接进入桶的详情页。

点击“新建文件夹”按钮,创建一个名为“pytorch”的文件夹,在此文件夹下再创建两个子文件夹,分别命名“log”和“demo-code”。Demo-code文件夹存放训练脚本,log文件夹存放训练日志。


回到命令行窗口,在context文件夹下,使用vim pytorch-verification.py命令新建编辑训练脚本,单击“i”键进入插入模式,输入如下内容,确认无误后单击ESC回到命令模式,使用“:wq”命令保存退出。
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)

新建好脚本后,回到OBS控制台页面,进入到demo-code文件夹,将脚本上传到demo-code文件夹下。


点击“添加文件”,在/developer/context目录下,选择刚刚创建的pytorch-verification.py文件,点击“打开”,完成上传。

1.9 在ModelArts上创建训练作业
在华为云首页,依次选择“产品”>“人工智能”>“AI开发平台ModelArts”,进入服务页面,点击“控制台”按钮,进入控制台页面。

第一次使用ModelArts平台,会提示权限不足,需要授权OBS服务和SWR服务。

点击上面红框的“此处”的超链接,进入授权委托页面,选择“新增委托”,权限配置选择“普通用户”,然后点击“创建”按钮即可。重新回到ModelArts控制台页面,提示权限不足的红框就消失了,可以正常使用了。

在左侧导航栏中选择“模型训练 > 训练作业”,默认进入“训练作业”列表。
按照如下表格填入参数信息:




训练作业创建完成后,后台将自动完成容器镜像下载、代码目录下载、执行启动命令等动作。
训练作业一般需要运行一段时间。

训练完成后,在OBS服务,我们创建的桶和log文件夹下找到训练日志并下载下来,在下载的日志文件中搜索关键字:tensor,看到如下信息表示训练成功。


至此,实验完成。
基于云主机的ModelArts模型训练实践,让开发环境化繁为简的更多相关文章
- 基于gulp编写的一个简单实用的前端开发环境好了,安装完Gulp后,接下来是你大展身手的时候了,在你自己的电脑上面随便哪个地方建一个目录,打开命令行,然后进入创建好的目录里面,开始撸代码,关于生成的json文件请点击这里https://docs.npmjs.com/files/package.json,打开的速度看你的网速了注意:以下是为了演示 ,我建的一个目录结构,你自己可以根据项目需求自己建目
		
自从Node.js出现以来,基于其的前端开发的工具框架也越来越多了,从Grunt到Gulp再到现在很火的WebPack,所有的这些新的东西的出现都极大的解放了我们在前端领域的开发,作为一个在前端领域里 ...
 - 基于gulp编写的一个简单实用的前端开发环境
		
自从Node.js出现以来,基于其的前端开发的工具框架也越来越多了,从Grunt到Gulp再到现在很火的WebPack,所有的这些新的东西的出现都极大的解放了我们在前端领域的开发,作为一个在前端领域里 ...
 - kaldi基于GMM的单音素模型 训练部分
		
目录 1. gmm-init-mono 模型初始化 2. compile-train-graghs 训练图初始化 3. align-equal-compiled 特征文件均匀分割 4. gmm-acc ...
 - supervessel-免费云镜像︱GPU加速的Caffe深度学习开发环境
		
开发环境介绍 在SuperVessel云上,我们为大家免费提供当前火热的caffe深度学习开发环境.SuperVessel的Caffe有如下优点: 1) 免去了繁琐的Caffe环境的安装配置,即申请即 ...
 - 新阿里云服务器从0开始配置为python开发环境
		
由于每次打开linux虚拟机比较麻烦,于是尝试一下云服务器,在阿里云领取了一个月的试用服务器,这里记录一下新服务器从0配置成python开发环境的步骤,以便以后配置新服务器时有个参考. 免费领取一个月 ...
 - 基于jeesite的cms系统(一):开发环境搭建
		
基于jeesite的cms系统系列,是对基于jeesite进行二次开发的博客模块开发过程的总结.涉及入门安装,二次开发,部署等 一.概况: JeeSite 是一个 Java 企业级快速开发平台,基于经 ...
 - Mac下基于testrpc和truffle的以太坊智能合约开发环境搭建
		
原文地址:石匠的blog truffle是一个基于Javascript开发的一套智能合约开发框架,使用Solidity语言编写合约.truffle有一套自动的项目构建机制,集成了开发,测试和部署的各个 ...
 - 基于visual studio 2017 以及cubemx 搭建stm32的开发环境(0)
		
(1)安装visual studio 2017 官网下载安装即可 (2)安装visual GDB 链接:https://pan.baidu.com/s/1TgXI1BRQLAWiWlqCcIS9TA ...
 - 基于visual studio 2017 以及cubemx 搭建stm32的开发环境(2)
		
主要解决 vs2017中,printf无法打印数据的问题. 在keil环境下正常使用printf功能,但是以下的重定向代码在vs2017下使用不了: #ifdef __GNUC__ /* With G ...
 - 基于visual studio 2017 以及cubemx 搭建stm32的开发环境(1)
		
参考如下文档: 传送门:http://www.stm32cube.com/article/128 如果链接不存在的话,下载我截屏好的图: 传送门:https://pan.baidu.com/s/1NC ...
 
随机推荐
- PTA甲级—图
			
1.图的遍历 1013 Battle Over Cities (25 分) 一种方法使用dfs求连通块的个数 #include <cstdio> #include <cstring& ...
 - MyBatis——案例——修改(修改全部字段,修改动态字段)
			
修改-修改全部字段 1.编写接口方法:Mapper接口 参数:所有数据 结果:void(通过异常捕获判断成功修改与否) int (表示sql语句影响的行数) /** ...
 - [OI] 二项式期望 DP
			
OSU OSU yet Another OSU yet yet Another OSU OSU 的题目是这样的:有一些相邻的块,给定每一个块的联通概率,每个连通块对答案有 \(size^{3}\) 的 ...
 - WiFi基础(五):802.11帧结构与WiFi控制帧、管理帧、数据帧
			
liwen01 2024.09.22 前言 前面介绍了 WiFi 的工作原理和 WiFi 的接入过程,这里将通过分析 WiFi 具体数据包结构,让你对 WiFi 工作原理和接入过程有一个更进一步的了解 ...
 - 【赵渝强老师】使用Docker Compose进行服务编排
			
一.什么是Docker Compose? Docker Compose是一个用来定义和运行复杂应用的Docker工具.一个使用Docker容器的应用,通常由多个容器组成.使用Docker Compos ...
 - nestjs 登录和验证码结合验证 svgCaptcha 包  session 会话标识
			
// ps: 现在用户验证使用 token jwt 了 代替了 session // session 是服务器为每个用户建立的唯一标识 以区分用户 会话标识 // session 是express中的 ...
 - .Net 反射的学习
			
// 反射 // 一切从 type 开始 2 种拿到 type 的方式 // 作用:动态的操作对象 获取属性 方法 特性 // 1. 拿到对象的 type // typeof(类); // 2. 拿到 ...
 - .NET云原生应用实践(二):Sticker微服务RESTful API的实现
			
本章目标 完成数据访问层的基本设计 实现Sticker微服务的RESTful API 引言:应该使用ORM框架吗? 毋庸置疑,Sticker微服务需要访问数据库来管理"贴纸"(也就 ...
 - 云原生周刊:Kubernetes v1.29 新特性一览 | 2023.12.11
			
开源项目推荐 kubedog Kubedog 是一个用于在 CI/CD 部署管道中监视和跟踪 Kubernetes 资源的库. 这个库被用于 werf CI/CD 工具中,在部署过程中跟踪资源. Ru ...
 - AOT漫谈专题(第七篇): 聊一聊给C#打造的节点依赖图
			
一:背景 1. 讲故事 上一篇我们聊过AOT编程中可能会遇到的三大件问题,而这三大件问题又是考验你对AOT中节点图的理解,它是一切的原点,接下来我就画几张图以个人的角度来解读下吧,不一定对. 二:理解 ...