基於雲主機的ModelArts模型訓練實踐,讓開發環境化繁為簡

华为云开发者联盟發表於2024-12-10

本文分享自華為雲社群《【開發者空間實踐】雲主機安裝Docker並製作自定義映象在ModelArts平臺做模型訓練》,作者: 開發者空間小蜜蜂。

1.1 案例介紹

在AI業務開發以及執行的過程中,一般都會有複雜的環境依賴需要進行調測並固化。面對開發中的開發環境的脆弱和多軌切換問題,在ModelArts的AI開發最佳實踐中,透過容器映象的方式將執行環境進行固化,以這種方式不僅能夠進行依賴管理,而且可以方便的完成工作環境切換。配合ModelArts提供的雲化容器資源使用,可以更加快速、高效的進行AI開發與模型實驗的迭代等。

本案例將指導開發者如何在雲主機上安裝Docker製作一個自定義模型映象並在ModelArts平臺使用這個映象作模型訓練。

1.2 免費領取雲主機

如您還沒有云主機,可點選連結,領取專屬雲主機後進行操作。

如您已領取雲主機,可直接開始實驗。

1.3 實驗流程

說明:

  1. 在雲主機上安裝docker;

  2. 製作模型訓練映象並上傳到SWR;

  3. 在雲主機建立訓練指令碼,使用瀏覽器開啟OBS服務,上傳訓練指令碼;

  4. 在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,看到如下資訊表示訓練成功。

至此,實驗完成。

相關文章