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