摘要:你可以發布一個可再現的機器學習項目,它幾乎不需要用戶設置,不需要用戶花小時去下載依賴或者報錯相反,你可以這樣做這種方法可以直接運行你的腳本,所有的依賴包括支持都幫你準備好了。應該怎么做針對機器學習的使用場景,你較好把你的代碼發布到上。
Docker提供了一種將Linux Kernel中需要的內容靜態鏈接到你的應用中的方法。Docker容器可以使用宿主機的GPUs,因此我們可以把TensorFlow或者機器學習代碼的任何依賴都鏈接到容器中,這樣其他小伙伴就可以使用你的工作成果了。
你可以發布一個可再現的機器學習項目,它幾乎不需要用戶設置,不需要用戶花6小時去下載依賴或者報錯:
# 6 hours of installing dependencies
python train.py
> ERROR: libobscure.so cannot open shared object
相反,你可以這樣做:
dockrun tensorflow/tensorflow:0.12.1-gpu python train.py
TRAINING SUCCESSFUL
這種方法可以直接運行你的train.py腳本,所有的依賴包括GPU支持都幫你準備好了。
Docker容器是短暫的,不需要持久化任何數據,你可以把Docker容器想象成1G大的tensorflow.exe,它把你所有的依賴都編譯進去了。
Why
開源軟件因為有難以重現、復雜的依賴網絡:不同版本的編譯器、丟失頭文件、錯誤的庫路徑等,所有這些導致在軟件的安裝配置階段浪費你大量的時間。
使用Docker時,理論上你只要要讓Docker正確工作,然后你所有的代碼就可以運行了。幸運的是,Docker已經融資1.8億美元,并將一部分投入到docker開發中,轉換成可以工作的軟件。
我打算在Linux上用Docker,Mac上的用法應該一樣,除了不支持GPU。
應該怎么做
針對機器學習的使用場景,你較好把你的代碼發布到GitHub repo上。你的依賴通常表示成一系列Linux命令行,這些命令行能復制粘帖到終端中運行。(譯者注:即依賴放到Dockerfile中)。
Docker用一個命令替換第二部分(譯者注:第一部分是把代碼放到GitHub repo上,第二部分是在Docker鏡像中執行命令行,配置你的依賴),該命令將拉取運行代碼所需的正確docker鏡像。你會把所有的依賴集成到3G大(壓縮后)的鏡像中,用戶可以直接下載使用你的鏡像。
我們看看Torch pix2pix的實現方式:
git clone https://github.com/phillipi/pix2pix.git
cd pix2pix
bash datasets/download_dataset.sh facades
# install dependencies for some time
...
# train
env
DATA_ROOT=datasets/facades
name=facades
niter=200
save_latest_freq=400
which_direction=BtoA
display=0
gpu=0
cudnn=0
th train.lua
盡管訓練腳本的依賴很少(做到這樣很偉大了),但是腳本使用的工具卻有很多依賴,而且這些依賴文檔不全面,組合在一個鏡像中非常復雜繁瑣。
如果你不小心弄亂了依賴,可能會遇到下面的錯誤:
luajit: symbol lookup error:
/root/torch/install/lib/lua/5.1/libTHNN.so: undefined symbol: TH_CONVERT_ACCREAL_TO_REAL
Docker提供了一種方法,通過Docker Hub分發二進制鏡像(譯者注:原文是artifact)。
Dockerized
在Linux server上直接安裝docker和nvidia-docker,Docker容器可以訪問GPU,沒有明顯的性能損失。
如果你在Mac上你需要安裝Docker for Mac(https://docs.docker.com/docker-for-mac/),在Mac上使用Docker我還是有很多經驗的。現在你還不能在GPU上運行任何東西,Mac幾乎不再支持CUDA。你可以在CPU模式下測試,它工作良好,只是有點慢。
我這里有一個在Ubuntu 16.04 LTS上安裝Docker的腳本,適用于云服務提供商:
curl -fsSL https://affinelayer.com/docker/setup-docker.py | sudo python3
裝好Docker后,運行pix2pix代碼:
sudo docker run --rm --volume /:/host --workdir /host$PWD affinelayer/pix2pix
下面是完整的腳本,多行顯示方便閱讀:
git clone https://github.com/phillipi/pix2pix.git
cd pix2pix
bash datasets/download_dataset.sh facades
sudo docker run
--rm
--volume /:/host
--workdir /host$PWD
affinelayer/pix2pix
env
DATA_ROOT=datasets/facades
name=facades
niter=200
save_latest_freq=400
which_direction=BtoA
display=0
gpu=0
cudnn=0
th train.lua
它會下載我構建的鏡像(鏡像包含Torch,支持nvidia-docker),大小在3G。
運行后會打印debug信息,到這里已經很棒了。但運行在GPU上更重要,因為pix2pix的架構設計在GPU上可以獲得足夠的訓練速度。
GPU
在GPU上運行只需要把上面命令中的docker鏡像替換成nvidia-docker。
nvidia-docker不包含在標準Docker中,所以你需要額外的工作。下面的腳本可以在Ubuntu 16.04 LTS上配置nvidia-docker:
curl -fsSL https://affinelayer.com/docker/setup-nvidia-docker.py | sudo python3
大概花費5分鐘,而且我已經在AWS和Azure上測試過了。兩者都是NVIDIA K80卡,額定值為2.9 FP32 TFLOPS。
nvidia-docker配置好運行:
sudo nvidia-docker run --rm nvidia/cuda nvidia-smi
假設上面的命令正常運行,重新運行pix2pix的腳本:
sudo nvidia-docker run
--rm
--volume /:/host
--workdir /host$PWD
affinelayer/pix2pix
env
DATA_ROOT=datasets/facades
name=facades
niter=200
save_latest_freq=400
which_direction=BtoA
display=0
th train.lua
它使用相同的Docker鏡像,但是支持GPU。
提示
使用Python和TensorFlow時,有許多有用的命令行選項:
--env PYTHONUNBUFFERED=x
這會讓python立即打印輸出,而不是先緩存起來。
--env CUDA_CACHE_PATH=/host/tmp/cuda-cache
這使得你每次啟動Tensorflow時都沒有1分鐘的延遲,它必須從頭重新編譯CUDA內核。
這兩個選項集成到Docker命令行中后:
sudo nvidia-docker run
--rm
--volume /:/host
--workdir /host$PWD
--env PYTHONUNBUFFERED=x
--env CUDA_CACHE_PATH=/host/tmp/cuda-cache
這個命令很長,你可以定義命令別名:
alias dockrun="sudo nvidia-docker run --rm --volume /:/host --workdir /host$PWD --env PYTHONUNBUFFERED=x --env CUDA_CACHE_PATH=/host/tmp/cuda-cache"
定義別名后運行pix2pix-tensorflow(https://github.com/affinelayer/pix2pix-tensorflow):
git clone https://github.com/affinelayer/pix2pix-tensorflow.git
cd pix2pix-tensorflow
python tools/download-dataset.py facades
dockrun affinelayer/pix2pix-tensorflow python pix2pix.py
--mode train
--output_dir facades_train
--max_epochs 200
--input_dir facades/train
--which_direction BtoA
pix2pix-tensorflow除了Tensorflow 0.12.1(當時當前發布的版本)之外沒有別的依賴關系。但是即使如此,第一個GitHub issue是一個用戶使用錯誤版本的Tensorflow導致的。
如何集成
幸運地是,集成到你自己的項目中非常簡單。
你先新建空目錄,新建文件Dockerfile。然后構建鏡像:
mkdir docker-build
cd docker-build
curl -O https://affinelayer.com/docker/Dockerfile
sudo docker build --rm --no-cache --tag pix2pix .
構建結束后你就可以查看鏡像了:
sudo docker images pix2pix
REPOSITORY ? ? ? ? ?TAG ? ? ? ? ? ? ? ? IMAGE ID ? ? ? ? ? ?CREATED ? ? ? ? ? ? SIZE
pix2pix ? ? ? ? ? ? latest ? ? ? ? ? ? ?bf5bd6bb35f8 ? ? ? ?3 seconds ago ? ? ? 11.38 GB
通過docker push把你的鏡像推送到Docker Hub上:
sudo docker tag pix2pix
sudo docker push
Docker新用戶可以先使用我的鏡像。docker提供了不依賴Docker Hub分發鏡像的機制,但是他用起來不是很方便:
# save image to disk, this took about 18 minutes
sudo docker save pix2pix | gzip > pix2pix.image.gz
# load image from disk, this took about 4 minutes
gunzip --stdout pix2pix.image.gz | sudo docker load
再現性
雖然Docker鏡像容易復制,但是從Dockerfile到鏡像的轉換不一定是可復制的。你可以使用下面的命令檢查鏡像的構建歷史記錄:
sudo docker history --no-trunc pix2pix
它不會顯示被添加到鏡像中的所有文件。比如,如果你的Dockerfile包含git clone或者apt-get update,很可能在兩個不同的日子里構建產生不同的鏡像。
另外,如果docker構建時指定了cpu版本,那么鏡像在其它機器上很可能不工作。
只要我們分發的是Docker鏡像,那么它就是可再現的。如果你想通過Dockerfile再現鏡像,如果你不非常小心編寫構建Dockerfile的話,很可能失敗。(譯者注:鏡像構建好后不會變,可再現,但是從Dockerfile構建,很可能因為cpu版本、git clone倉庫更新而不可再現鏡像)
目前還不清楚這些優勢是否值得付出努力,但是如果你的Dockerfile是從頭開始構建的,并且使用--network none選項,大多數情形鏡像是可重現的。
如果鏡像再現很容易,這項技術將會很酷。現在Docker已經取得實質性進展,讓依賴再現成為可能,這是偉大的進步。
譯者說
這篇文章介紹了Docker與深度學習結合的例子。Docker的優勢是解決了依賴的問題,方便分發個人工作成果;缺點是不直接支持GPU,需要開發者自己安裝nvidia-docker。
文章最后作者論述了Docker鏡像的可再現問題,總結如下:
分發的是Docker鏡像,那么基本可以保證鏡像的一致性(可再現)。
分發的是Dockerfile,Dockerfile中存在git clone或者apt update,會因為時間因素導致clone的repo更新導致鏡像不一致。
歡迎加入本站公開興趣群商業智能與數據分析群
興趣范圍包括各種讓數據產生價值的辦法,實際應用案例分享與討論,分析工具,ETL工具,數據倉庫,數據挖掘工具,報表系統等全方位知識
QQ群:81035754
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/4473.html
摘要:關于本文是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的機器上。比如說,通過堆棧來開發應用的每個部分。開發環境之前提到的,能夠很容易的引入文件并且使用它們。 關于本文Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的 Linux 機器上。幾乎沒有性能開銷,可以很容...
摘要:本人計劃編寫一個針對中初級前端開發者學習的系列教程玩轉。使用的原因是新的語言規范開發效率更高代碼更優雅,尤其是基于開發的項目。其次也是目前特別流行的一個前端框架,截止目前,上有將近萬,國內一二線互聯網公司都有深度依賴開發的項目。 本人計劃編寫一個針對中初級前端開發者學習 React 的系列教程 - 《玩轉 React》。 文章更新頻率:每周 1 ~ 2 篇。 目錄 玩轉 React(...
摘要:近日,外媒刊登了一篇機器學習與網絡安全相關的資料大匯總,文中列出了相關數據源的獲取途徑,優秀的論文和書籍,以及豐富的教程。這個視頻介紹了如何將機器學習應用于網絡安全探測,時長約小時。 近日,外媒 KDnuggets 刊登了一篇機器學習與網絡安全相關的資料大匯總,文中列出了相關數據源的獲取途徑,優秀的論文和書籍,以及豐富的教程。大部分都是作者在日常工作和學習中親自使用并認為值得安利的純干貨。數...
閱讀 1342·2021-09-24 10:26
閱讀 3655·2021-09-06 15:02
閱讀 604·2019-08-30 14:18
閱讀 575·2019-08-30 12:44
閱讀 3118·2019-08-30 10:48
閱讀 1936·2019-08-29 13:09
閱讀 1992·2019-08-29 11:30
閱讀 2278·2019-08-26 13:36