|
容器技術(shù)(例如Docker)極大地簡(jiǎn)化了依賴性管理和軟件的可移植性。在本系列文章中,我們將探討Docker在機(jī)器學(xué)習(xí)(ML)場(chǎng)景中的用法。 本系列假定您熟悉ML,一般的容器化,尤其是Docker。歡迎您下載項(xiàng)目代碼。 在上一篇文章中,我們創(chuàng)建了用于實(shí)驗(yàn),訓(xùn)練和推斷的基本容器。為此,我們使用了Intel/AMD和ARMCPU。在這一節(jié)中,我們將利用NvidiaGPU的功能來(lái)減少訓(xùn)練和推理時(shí)間。 準(zhǔn)備Docker主機(jī)以使用NvidiaGPU要使用來(lái)自Docker的GPU,我們需要具有NvidiaGPU和Linux的主機(jī)(自2020年12月以來(lái),GPU支持也通過(guò)WindowsLinux子系統(tǒng)(WSL2)在Windows上運(yùn)行)。在云中,您所需要做的就是選擇適當(dāng)?shù)腣M大小和OS映像。例如,在Azure上具有Ubuntu18.04的NC6和數(shù)據(jù)科學(xué)虛擬機(jī)。 根據(jù)Linux發(fā)行版和GPU模型的不同,在本地計(jì)算機(jī)上的配置可能會(huì)要求更高: 確保主機(jī)上已安裝NvidiaGPU驅(qū)動(dòng)程序。 安裝適合您的發(fā)行版的nvidia-container-runtime。 重新啟動(dòng)Docker守護(hù)程序。 現(xiàn)在,您應(yīng)該可以運(yùn)行帶有--gpus屬性的容器了。例如,僅使用第一個(gè)GPU: $ docker run --gpus "device=0" nvidia/cuda:11.2.1-runtime nvidia-smi1復(fù)制代碼類型:[html]
在主機(jī)和容器中使用相同的CUDA版本(在本例中為11.2)很重要。如果版本不匹配,則容器將無(wú)法啟動(dòng),并顯示諸如“條件不滿足:cuda>=11.0”之類的錯(cuò)誤。 預(yù)測(cè)Dockerfile我們建議您始終從給定任務(wù)可用的最小基礎(chǔ)映像開(kāi)始,通常后綴為“運(yùn)行時(shí)”。盡管“devel”后綴似乎更合適,但它表示的圖像包含了大多數(shù)ML場(chǎng)景中不需要的許多工具。 使用Nvidia提供的基本映像(例如,上面提到的nvidia/cuda:11.2.1-runtime),在其中安裝Python和我們的庫(kù)可能很誘人。不幸的是,這至少在TensorFlow中不起作用。我們可以按照提供的逐步說(shuō)明進(jìn)行操作,也可以使用官方推薦的TensorflowDocker映像。 我們將使用后一種選擇。除了該FROM語(yǔ)句外,新的預(yù)測(cè)Dockerfile的其余部分與我們用于僅CPU版本的預(yù)測(cè)相同: FROM tensorflow/tensorflow:2.3.2-gpu ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get -y install --no-install-recommends ffmpeg libsm6 libxext6 && apt-get autoremove -y && apt-get clean -y && rm -rf /var/lib/apt/lists/* ARG USERNAME=mluser ARG USERID=1000 RUN useradd --system --create-home --shell /bin/bash --uid $USERID $USERNAME COPY requirements.txt /tmp/requirements.txt RUN pip3 install --no-cache-dir -r /tmp/requirements.txt && rm /tmp/requirements.txt USER $USERNAME WORKDIR /home/$USERNAME/app COPY app /home/$USERNAME/app ENTRYPOINT ["python", "predict.py"]123456789101112131415復(fù)制代碼類型:[html] 請(qǐng)注意,我們使用TensorFlow版本2.3.2,而不是以前的2.4.1。主要原因是2.4.1版的官方Docker映像要大得多(>5.5GB,而選定的映像約為3GB)。稍舊的版本足以滿足我們的目的。 因?yàn)槲覀兪褂靡寻琓ensorFlow的基礎(chǔ)圖像(以及匹配的NumPy版本),所以我們的requirements.txt縮小為一行: opencv-python==4.5.1.481復(fù)制代碼類型:[html] 下載項(xiàng)目代碼后,我們可以構(gòu)建圖像: $ docker build --build-arg USERID=$(id -u) -t mld05_gpu_predict .1復(fù)制代碼類型:[html] 如前所述,--build-argUSERID如果不需要該參數(shù),則可以跳過(guò)該參數(shù)(尤其是在Windows上)。 培訓(xùn)Dockerfile因?yàn)槲覀儾粌H希望將GPU用于預(yù)測(cè),還希望將其用于訓(xùn)練,所以我們需要引入其他圖像定義-Dockerfile.train: FROM mld05_gpu_predict:latest ENTRYPOINT ["python", "train.py"]12復(fù)制代碼類型:[html] 我們ENTRYPOINT僅以預(yù)測(cè)圖像為基礎(chǔ),并添加一個(gè)用train.py腳本覆蓋的單層。為了避免增加圖像和代碼重復(fù)的數(shù)量,這是一個(gè)很小的折衷。我們不介意此處的“最新”標(biāo)簽,因?yàn)槲覀兛梢酝耆刂扑褂玫幕緢D像。 現(xiàn)在,我們來(lái)構(gòu)建它: $ docker build -t mld05_gpu_train -f 'Dockerfile.train' .1復(fù)制代碼類型:[html] 進(jìn)行培訓(xùn)讓我們嘗試使用GPU和CPU進(jìn)行培訓(xùn)-比較性能。 使用GPU進(jìn)行培訓(xùn): $ docker run -v $(pwd)/data:/home/mluser/data -v $(pwd)/models:/home/mluser/models --rm --user $(id -u):$(id -g) --gpus "device=0" mld05_gpu_train --model_path ../models/mnist_model.h5 --epochs 5123復(fù)制代碼類型:[html]
請(qǐng)注意--model_path傳遞給訓(xùn)練腳本的和--epochs參數(shù)。 要僅使用CPU進(jìn)行訓(xùn)練,我們只需刪除--gpus“device=0”參數(shù): $ docker run -v $(pwd)/data:/home/mluser/data -v $(pwd)/models:/home/mluser/models --rm --user $(id -u):$(id -g) mld05_gpu_train --model_path ../models/mnist_model.h5 --epochs 5123復(fù)制代碼類型:[html]
如您所見(jiàn),GPU將訓(xùn)練速度提高了一倍(從CPU上的每個(gè)周期18秒增加到GPU上的每個(gè)周期8秒)。數(shù)量不多,但是我們?cè)谶@里訓(xùn)練一個(gè)非常簡(jiǎn)單的模型。完成一項(xiàng)現(xiàn)實(shí)生活中的任務(wù),您可以預(yù)期獲得5到10倍的改進(jìn)。 如果結(jié)果不同,請(qǐng)查看TensorFlow日志。如果無(wú)法使用GPU,您將看到諸如“無(wú)法加載動(dòng)態(tài)庫(kù)(...)”之類的錯(cuò)誤。 運(yùn)行預(yù)測(cè)訓(xùn)練好模型后,我們可以檢查其在預(yù)測(cè)中的表現(xiàn): $ docker run -v $(pwd)/data:/home/mluser/data -v $(pwd)/models:/home/mluser/models --rm --user $(id -u):$(id -g) --gpus "device=0" mld05_gpu_predict --images_path /home/mluser/data/test_mnist_images/*.jpg123復(fù)制代碼類型:[html]
概括在本文中,我們已經(jīng)成功地使用帶有GPU支持的Docker容器進(jìn)行了訓(xùn)練和推理。我們已經(jīng)準(zhǔn)備好使用Docker處理基本的ML任務(wù)。在下一個(gè)系列中,我們將擴(kuò)展我們的知識(shí),以解決更復(fù)雜的情況,這在實(shí)際場(chǎng)景中使用Docker時(shí)通常很常見(jiàn)。 |
|
|
來(lái)自: 碼農(nóng)9527 > 《WEB》