[AWS/Inf1/コンテナ軽量化]torch-neuron用Dockerfileを作る~脱DeepLearningContainer~
AWS Neuron
イメージサイズが5.8GBから2.4GBになった
対象読者
ECSでInf1インスタンスを使っている人。
Inf1インスタンスを運用したい人。
Inf1でPyTorchを使う人。
イメージサイズは小さい方が好きな人。
ECRからのプル時間を減らしたい人。
結論
Deep Learning Containerをやめて、torch-neruonの入ったイメージを自分で作成するとイメージサイズが半分以下になります。サイズが小さくなるのでECRからプルする時間も減少します。
上がDeep Learning Containerで下が自作
イメージサイズ | Docker Pullに要する時間[1] | |
---|---|---|
Deep Learning Container[2] | 4.1GB | 139sec |
自作コンテナ | 1.7GB | 61sec |
Deep Learning Containerのサイズは大きい
AWSのドキュメントを読むと、Deep Learning Containerの案内があります。
そのためInf1インスタンスをいざ使ってみようと、とりあえずDeep Learning Containerを採用してそのまま運用している方もいるのではないでしょうか。
そのイメージなかなか大盛りです。
Inf1用のDeep Learning Container[3]をECRにプッシュしてみると
4166.61MB
あります。
763104351884.dkr.ecr.ap-northeast-1.amazonaws.comからイメージをプルするために
139秒
かかりました。
どうやらDeep Learning ContainerのDockerfileはすぐに開発が開始できるようになのか、エディタや様々なPythonライブラリが入っているようです。
pipとcondaにはたくさんのライブラリが確認できます。
conda list (クリックで開きます)
$conda list
# packages in environment at /opt/conda:
#
# Name Version Build Channel
_libgcc_mutex 0.1 conda_forge conda-forge
_openmp_mutex 4.5 2_kmp_llvm conda-forge
absl-py 1.3.0 pypi_0 pypi
alsa-lib 1.2.8 h166bdaf_0 conda-forge
aom 3.5.0 h27087fc_0 conda-forge
astor 0.8.1 pypi_0 pypi
asttokens 2.2.1 pypi_0 pypi
attr 2.5.1 h166bdaf_1 conda-forge
attrs 22.1.0 pypi_0 pypi
awscli 1.27.33 pypi_0 pypi
backcall 0.2.0 pypi_0 pypi
boto3 1.26.33 pypi_0 pypi
botocore 1.29.33 pypi_0 pypi
brotlipy 0.7.0 py38h0a891b7_1005 conda-forge
bzip2 1.0.8 h7f98852_4 conda-forge
c-ares 1.18.1 h7f98852_0 conda-forge
ca-certificates 2022.12.7 ha878542_0 conda-forge
cached-property 1.5.2 hd8ed1ab_1 conda-forge
cached_property 1.5.2 pyha770c72_1 conda-forge
cairo 1.16.0 ha61ee94_1014 conda-forge
certifi 2022.12.7 pyhd8ed1ab_0 conda-forge
cffi 1.15.1 py38h4a40e3a_3 conda-forge
charset-normalizer 2.0.12 pyhd8ed1ab_0 conda-forge
colorama 0.4.4 pypi_0 pypi
conda 4.12.0 py38h578d9bd_0 conda-forge
conda-content-trust 0.1.3 pyhd8ed1ab_0 conda-forge
conda-package-handling 2.0.2 pyh38be061_0 conda-forge
conda-package-streaming 0.7.0 pyhd8ed1ab_1 conda-forge
cryptography 38.0.4 py38h2b5fc30_0 conda-forge
cython 0.29.32 py38hfa26641_1 conda-forge
dbus 1.13.6 h5008d03_3 conda-forge
decorator 5.1.1 pypi_0 pypi
dmlc-nnvm 1.13.0.0+0 pypi_0 pypi
dmlc-topi 1.13.0.0+0 pypi_0 pypi
dmlc-tvm 1.13.0.0+0 pypi_0 pypi
docutils 0.16 pypi_0 pypi
enum-compat 0.0.3 pypi_0 pypi
exceptiongroup 1.0.4 pypi_0 pypi
executing 1.2.0 pypi_0 pypi
expat 2.5.0 h27087fc_0 conda-forge
ffmpeg 5.1.2 gpl_h8dda1f0_105 conda-forge
fftw 3.3.10 nompi_hf0379b8_106 conda-forge
font-ttf-dejavu-sans-mono 2.37 hab24e00_0 conda-forge
font-ttf-inconsolata 3.000 h77eed37_0 conda-forge
font-ttf-source-code-pro 2.038 h77eed37_0 conda-forge
font-ttf-ubuntu 0.83 hab24e00_0 conda-forge
fontconfig 2.14.1 hc2a2eb6_0 conda-forge
fonts-conda-ecosystem 1 0 conda-forge
fonts-conda-forge 1 0 conda-forge
freeglut 3.2.2 h9c3ff4c_1 conda-forge
freetype 2.12.1 hca18f0e_1 conda-forge
future 0.18.2 pypi_0 pypi
gast 0.2.2 pypi_0 pypi
gettext 0.21.1 h27087fc_0 conda-forge
glib 2.74.1 h6239696_1 conda-forge
glib-tools 2.74.1 h6239696_1 conda-forge
gmp 6.2.1 h58526e2_0 conda-forge
gnutls 3.7.8 hf3e180e_0 conda-forge
google-pasta 0.2.0 pypi_0 pypi
graphite2 1.3.13 h58526e2_1001 conda-forge
grpcio 1.51.1 pypi_0 pypi
gst-plugins-base 1.21.2 h3e40eee_0 conda-forge
gstreamer 1.21.2 hd4edc92_0 conda-forge
gstreamer-orc 0.4.33 h166bdaf_0 conda-forge
h5py 2.10.0 pypi_0 pypi
harfbuzz 6.0.0 h8e241bc_0 conda-forge
hdf5 1.12.2 nompi_h2386368_100 conda-forge
icu 70.1 h27087fc_0 conda-forge
idna 3.4 pyhd8ed1ab_0 conda-forge
importlib-metadata 5.2.0 pypi_0 pypi
inferentia-hwm 1.13.0.0+0 pypi_0 pypi
iniconfig 1.1.1 pypi_0 pypi
ipython 8.7.0 pypi_0 pypi
islpy 2021.1+aws2021.x.80.0.bld0 pypi_0 pypi
jack 1.9.21 h583fa2b_2 conda-forge
jasper 2.0.33 ha77e612_0 conda-forge
jedi 0.18.2 pypi_0 pypi
jmespath 1.0.1 pypi_0 pypi
joblib 1.2.0 pyhd8ed1ab_0 conda-forge
jpeg 9e h166bdaf_2 conda-forge
keras-applications 1.0.8 pypi_0 pypi
keras-preprocessing 1.1.2 pypi_0 pypi
keyutils 1.6.1 h166bdaf_0 conda-forge
krb5 1.20.1 hf9c8cef_0 conda-forge
lame 3.100 h166bdaf_1003 conda-forge
ld_impl_linux-64 2.39 hcc3a1bd_1 conda-forge
lerc 4.0.0 h27087fc_0 conda-forge
libarchive 3.5.2 hb890918_3 conda-forge
libblas 3.9.0 16_linux64_openblas conda-forge
libcap 2.66 ha37c62d_0 conda-forge
libcblas 3.9.0 16_linux64_openblas conda-forge
libclang 15.0.6 default_h2e3cab8_0 conda-forge
libclang13 15.0.6 default_h3a83d3e_0 conda-forge
libcups 2.3.3 h36d4200_3 conda-forge
libcurl 7.86.0 h6312ad2_2 conda-forge
libdb 6.2.32 h9c3ff4c_0 conda-forge
libdeflate 1.14 h166bdaf_0 conda-forge
libdrm 2.4.114 h166bdaf_0 conda-forge
libedit 3.1.20191231 he28a2e2_2 conda-forge
libev 4.33 h516909a_1 conda-forge
libevent 2.1.10 h9b69904_4 conda-forge
libffi 3.4.2 h7f98852_5 conda-forge
libflac 1.4.2 h27087fc_0 conda-forge
libgcc-ng 12.2.0 h65d4601_19 conda-forge
libgcrypt 1.10.1 h166bdaf_0 conda-forge
libgfortran-ng 12.2.0 h69a702a_19 conda-forge
libgfortran5 12.2.0 h337968e_19 conda-forge
libglib 2.74.1 h606061b_1 conda-forge
libglu 9.0.0 he1b5a44_1001 conda-forge
libgpg-error 1.45 hc0c96e0_0 conda-forge
libhwloc 2.8.0 h32351e8_1 conda-forge
libiconv 1.17 h166bdaf_0 conda-forge
libidn2 2.3.4 h166bdaf_0 conda-forge
liblapack 3.9.0 16_linux64_openblas conda-forge
liblapacke 3.9.0 16_linux64_openblas conda-forge
libllvm15 15.0.6 h63197d8_0 conda-forge
libmamba 0.22.1 hd8a31e3_1 conda-forge
libmambapy 0.22.1 py38h923e62a_1 conda-forge
libnghttp2 1.47.0 hdcd2b5c_1 conda-forge
libnsl 2.0.0 h7f98852_0 conda-forge
libogg 1.3.4 h7f98852_1 conda-forge
libopenblas 0.3.21 pthreads_h78a6416_3 conda-forge
libopencv 4.6.0 py38h340f60e_9 conda-forge
libopus 1.3.1 h7f98852_1 conda-forge
libpciaccess 0.17 h166bdaf_0 conda-forge
libpng 1.6.39 h753d276_0 conda-forge
libpq 15.1 h2baec63_2 conda-forge
libprotobuf 3.21.12 h3eb15da_0 conda-forge
libsndfile 1.1.0 hcb278e6_1 conda-forge
libsolv 0.7.23 h3eb15da_0 conda-forge
libsqlite 3.40.0 h753d276_0 conda-forge
libssh2 1.10.0 haa6b8db_3 conda-forge
libstdcxx-ng 12.2.0 h46fd767_19 conda-forge
libsystemd0 252 h2a991cd_0 conda-forge
libtasn1 4.19.0 h166bdaf_0 conda-forge
libtiff 4.5.0 h82bc61c_0 conda-forge
libtool 2.4.6 h9c3ff4c_1008 conda-forge
libudev1 252 h166bdaf_0 conda-forge
libunistring 0.9.10 h7f98852_0 conda-forge
libuuid 2.32.1 h7f98852_1000 conda-forge
libva 2.16.0 h166bdaf_0 conda-forge
libvorbis 1.3.7 h9c3ff4c_0 conda-forge
libvpx 1.11.0 h9c3ff4c_3 conda-forge
libwebp-base 1.2.4 h166bdaf_0 conda-forge
libxcb 1.13 h7f98852_1004 conda-forge
libxkbcommon 1.0.3 he3ba5ed_0 conda-forge
libxml2 2.10.3 h7463322_0 conda-forge
libzlib 1.2.13 h166bdaf_4 conda-forge
llvm-openmp 15.0.6 he0ac6c6_0 conda-forge
lz4-c 1.9.3 h9c3ff4c_1 conda-forge
lzo 2.10 h516909a_1000 conda-forge
mamba 0.22.1 py38h1abaa86_1 conda-forge
markdown 3.4.1 pypi_0 pypi
markupsafe 2.1.1 pypi_0 pypi
matplotlib-inline 0.1.6 pypi_0 pypi
mkl 2022.1.0 h84fe81f_915 conda-forge
mkl-include 2023.0.0 h84fe81f_25396 conda-forge
mpg123 1.31.1 h27087fc_0 conda-forge
mysql-common 8.0.31 haf5c9bc_0 conda-forge
mysql-libs 8.0.31 h28c427c_0 conda-forge
ncurses 6.3 h27087fc_1 conda-forge
nettle 3.8.1 hc379101_1 conda-forge
networkx 2.5 pypi_0 pypi
neuron-cc 1.13.5.0+7dcf000a6 pypi_0 pypi
nspr 4.35 h27087fc_0 conda-forge
nss 3.82 he02c5a1_0 conda-forge
numpy 1.18.5 pypi_0 pypi
opencv 4.6.0 py38h578d9bd_9 conda-forge
openh264 2.3.1 h27087fc_1 conda-forge
openssl 1.1.1s h0b41bf4_1 conda-forge
opt-einsum 3.3.0 pypi_0 pypi
p11-kit 0.24.1 hc5aa10d_0 conda-forge
packaging 20.4 pypi_0 pypi
pandas 1.4.0 pypi_0 pypi
parso 0.8.3 pyhd8ed1ab_0 conda-forge
pcre2 10.40 hc3806b6_0 conda-forge
pexpect 4.8.0 pypi_0 pypi
pickleshare 0.7.5 pypi_0 pypi
pillow 9.3.0 pypi_0 pypi
pip 22.3.1 pypi_0 pypi
pixman 0.40.0 h36c2ea0_0 conda-forge
pluggy 1.0.0 pypi_0 pypi
prompt-toolkit 3.0.36 pypi_0 pypi
protobuf 3.20.1 pypi_0 pypi
psutil 5.9.4 pypi_0 pypi
pthread-stubs 0.4 h36c2ea0_1001 conda-forge
ptyprocess 0.7.0 pypi_0 pypi
pulseaudio 16.1 h4a94279_0 conda-forge
pure-eval 0.2.2 pypi_0 pypi
py-opencv 4.6.0 py38h6f1a3b6_9 conda-forge
pyasn1 0.4.8 pypi_0 pypi
pybind11-abi 4 hd8ed1ab_3 conda-forge
pycosat 0.6.4 py38h0a891b7_1 conda-forge
pycparser 2.21 pyhd8ed1ab_0 conda-forge
pygments 2.13.0 pypi_0 pypi
pyopenssl 22.1.0 pyhd8ed1ab_0 conda-forge
pyparsing 3.0.9 pypi_0 pypi
pysocks 1.7.1 pyha2e5f31_6 conda-forge
pytest 7.2.0 pypi_0 pypi
python 3.8.13 h582c2e5_0_cpython conda-forge
python-dateutil 2.8.2 pypi_0 pypi
python_abi 3.8 3_cp38 conda-forge
pytz 2022.7 pypi_0 pypi
pyyaml 5.4.1 pypi_0 pypi
qt-main 5.15.6 h62441b5_5 conda-forge
readline 8.1.2 h0f457ee_0 conda-forge
reproc 14.2.3 h7f98852_0 conda-forge
reproc-cpp 14.2.3 h9c3ff4c_0 conda-forge
requests 2.28.1 pyhd8ed1ab_1 conda-forge
retrying 1.3.3 pypi_0 pypi
rsa 4.7.2 pypi_0 pypi
ruamel_yaml 0.15.80 py38h0a891b7_1008 conda-forge
s3transfer 0.6.0 pypi_0 pypi
sagemaker-inference 1.8.0 pypi_0 pypi
sagemaker-pytorch-inference 2.0.8 pypi_0 pypi
scikit-learn 1.2.0 py38h1e1a916_0 conda-forge
scipy 1.4.1 pypi_0 pypi
setuptools 65.6.3 pyhd8ed1ab_0 conda-forge
six 1.16.0 pyh6c4a22f_0 conda-forge
sqlite 3.40.0 h4ff8645_0 conda-forge
stack-data 0.6.2 pypi_0 pypi
svt-av1 1.4.1 hcb278e6_0 conda-forge
tbb 2021.7.0 h924138e_1 conda-forge
tensorboard 1.15.0 pypi_0 pypi
tensorflow 1.15.5 pypi_0 pypi
tensorflow-estimator 1.15.1 pypi_0 pypi
termcolor 2.1.1 pypi_0 pypi
threadpoolctl 3.1.0 pyh8a188c0_0 conda-forge
tk 8.6.12 h27826a3_0 conda-forge
tomli 2.0.1 pypi_0 pypi
torch 1.12.1 pypi_0 pypi
torch-model-archiver 0.5.3 pypi_0 pypi
torch-neuron 1.12.1.2.5.8.0 pypi_0 pypi
torchserve 0.5.3 pypi_0 pypi
torchvision 0.13.1 pypi_0 pypi
traitlets 5.8.0 pypi_0 pypi
typing 3.10.0.0 pyhd8ed1ab_0 conda-forge
typing-extensions 4.4.0 pypi_0 pypi
urllib3 1.26.13 pyhd8ed1ab_0 conda-forge
wcwidth 0.2.5 pypi_0 pypi
werkzeug 2.2.2 pypi_0 pypi
wheel 0.38.4 pyhd8ed1ab_0 conda-forge
wrapt 1.14.1 pypi_0 pypi
x264 1!164.3095 h166bdaf_2 conda-forge
x265 3.5 h924138e_3 conda-forge
xcb-util 0.4.0 h166bdaf_0 conda-forge
xcb-util-image 0.4.0 h166bdaf_0 conda-forge
xcb-util-keysyms 0.4.0 h166bdaf_0 conda-forge
xcb-util-renderutil 0.3.9 h166bdaf_0 conda-forge
xcb-util-wm 0.4.1 h166bdaf_0 conda-forge
xorg-fixesproto 5.0 h7f98852_1002 conda-forge
xorg-inputproto 2.3.2 h7f98852_1002 conda-forge
xorg-kbproto 1.0.7 h7f98852_1002 conda-forge
xorg-libice 1.0.10 h7f98852_0 conda-forge
xorg-libsm 1.2.3 hd9c2040_1000 conda-forge
xorg-libx11 1.7.2 h7f98852_0 conda-forge
xorg-libxau 1.0.9 h7f98852_0 conda-forge
xorg-libxdmcp 1.1.3 h7f98852_0 conda-forge
xorg-libxext 1.3.4 h7f98852_1 conda-forge
xorg-libxfixes 5.0.3 h7f98852_1004 conda-forge
xorg-libxi 1.7.10 h7f98852_0 conda-forge
xorg-libxrender 0.9.10 h7f98852_1003 conda-forge
xorg-renderproto 0.11.1 h7f98852_1002 conda-forge
xorg-xextproto 7.3.0 h7f98852_1002 conda-forge
xorg-xproto 7.0.31 h7f98852_1007 conda-forge
xz 5.2.6 h166bdaf_0 conda-forge
yaml 0.2.5 h7f98852_2 conda-forge
yaml-cpp 0.6.3 he1b5a44_4 conda-forge
zipp 3.11.0 pypi_0 pypi
zlib 1.2.13 h166bdaf_4 conda-forge
zstandard 0.19.0 py38h5945529_1 conda-forge
zstd 1.5.2 h6239696_4 conda-forge
pip list (クリックで開きます)
$pip list
Package Version
--------------------------- --------------------------
absl-py 1.3.0
astor 0.8.1
asttokens 2.2.1
attrs 22.1.0
awscli 1.27.33
backcall 0.2.0
boto3 1.26.33
botocore 1.29.33
brotlipy 0.7.0
cached-property 1.5.2
certifi 2022.12.7
cffi 1.15.1
charset-normalizer 2.0.12
colorama 0.4.4
conda 4.12.0
conda-content-trust 0.1.3
conda-package-handling 2.0.2
conda_package_streaming 0.7.0
cryptography 38.0.4
Cython 0.29.32
decorator 5.1.1
dmlc-nnvm 1.13.0.0+0
dmlc-topi 1.13.0.0+0
dmlc-tvm 1.13.0.0+0
docutils 0.16
enum-compat 0.0.3
exceptiongroup 1.0.4
executing 1.2.0
future 0.18.2
gast 0.2.2
google-pasta 0.2.0
grpcio 1.51.1
h5py 2.10.0
idna 3.4
importlib-metadata 5.2.0
inferentia-hwm 1.13.0.0+0
iniconfig 1.1.1
ipython 8.7.0
islpy 2021.1+aws2021.x.80.0.bld0
jedi 0.18.2
jmespath 1.0.1
joblib 1.2.0
Keras-Applications 1.0.8
Keras-Preprocessing 1.1.2
libmambapy 0.22.1
mamba 0.22.1
Markdown 3.4.1
MarkupSafe 2.1.1
matplotlib-inline 0.1.6
networkx 2.5
neuron-cc 1.13.5.0+7dcf000a6
numpy 1.18.5
opencv-python 4.6.0
opt-einsum 3.3.0
packaging 20.4
pandas 1.4.0
parso 0.8.3
pexpect 4.8.0
pickleshare 0.7.5
Pillow 9.3.0
pip 22.3.1
pluggy 1.0.0
prompt-toolkit 3.0.36
protobuf 3.20.1
psutil 5.9.4
ptyprocess 0.7.0
pure-eval 0.2.2
pyasn1 0.4.8
pycosat 0.6.4
pycparser 2.21
Pygments 2.13.0
pyOpenSSL 22.1.0
pyparsing 3.0.9
PySocks 1.7.1
pytest 7.2.0
python-dateutil 2.8.2
pytz 2022.7
PyYAML 5.4.1
requests 2.28.1
retrying 1.3.3
rsa 4.7.2
ruamel-yaml-conda 0.15.80
s3transfer 0.6.0
sagemaker-inference 1.8.0
sagemaker-pytorch-inference 2.0.8
scikit-learn 1.2.0
scipy 1.4.1
setuptools 65.6.3
six 1.16.0
stack-data 0.6.2
tensorboard 1.15.0
tensorflow 1.15.5
tensorflow-estimator 1.15.1
termcolor 2.1.1
threadpoolctl 3.1.0
tomli 2.0.1
torch 1.12.1
torch-model-archiver 0.5.3
torch-neuron 1.12.1.2.5.8.0
torchserve 0.5.3
torchvision 0.13.1
traitlets 5.8.0
typing_extensions 4.4.0
urllib3 1.26.13
wcwidth 0.2.5
Werkzeug 2.2.2
wheel 0.38.4
wrapt 1.14.1
zipp 3.11.0
zstandard 0.19.0
不要なパッケージは不要
システムの運用で使うイメージは起動時間を短くしたり、メンテナンスしやすくするために、なるべく小さいサイズにしたいものです。
不要なパッケージは入れるなとDockerのベストプラクティスにも書かれています。
Deep Learning Containerには、テキストエディタをはじめとして、運用では使わない可能性のあるパッケージが多く入っています。
torch-neuronとNeuron Runtime/Toolsが入ったイメージを作る
Neuron SDKのドキュメントにはtorch-neuronを入れるためのDockerfileが紹介されています。
ドキュメントに従いイメージを作ってみます。
2022年11月にpython3.8に対応したので、ベースとなるubuntuのイメージは20.04を使用しました[4]。
FROM ubuntu:20.04
LABEL maintainer=" "
RUN apt-get update -y \
&& apt-get install -y --no-install-recommends \
gnupg2 \
wget \
python3-pip \
python3-setuptools \
libcap-dev \
&& cd /usr/local/bin \
&& pip3 --no-cache-dir install --upgrade pip \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get clean
RUN echo "deb https://apt.repos.neuron.amazonaws.com bionic main" > /etc/apt/sources.list.d/neuron.list
RUN wget -qO - https://apt.repos.neuron.amazonaws.com/GPG-PUB-KEY-AMAZON-AWS-NEURON.PUB | apt-key add -
# Installing Neuron Runtime and Tools
RUN apt-get update -y && apt-get install -y \
aws-neuron-runtime \
aws-neuron-tools
# Sets up Path for Neuron tools
ENV PATH="/opt/bin/:/opt/aws/neuron/bin:${PATH}"
# Include framework tensorflow-neuron or torch-neuron and compiler (compiler not needed for inference)
RUN pip3 install \
torch-neuron \
--extra-index-url=https://pip.repos.neuron.amazonaws.com
CMD ["neuron-top"]
Neuron runtime/Neuron tools/torch-neruon/pytorchがインストールされたコンテナができました。
pipの中身も随分減りました。condaはなくなりました。
pip list (クリックで開きます)
$ pip3 list
Package Version
----------------- --------------
pip 23.0
setuptools 45.2.0
torch 1.12.1
torch-neuron 1.12.1.2.5.8.0
typing_extensions 4.4.0
wheel 0.34.2
イメージサイズは
4166.61MB → 1767.5MB
になりました。
ECRからプルする時間は
139秒 → 61秒
になりました。
さいごに
実際は自作コンテナに必要なパッケージを追加でインストールすることになると思います。その分を差し引いてもかなり小さくなるんじゃないかなと思います。
わたしが運用しているサービスのイメージサイズは5.8GBから2.4GBになりました。
Discussion