利用docker创建自定义pytorch环境
在开始之前,你需要对docker和dockerfile有一定的了解
镜像 | Docker — 从入门到实践
Dockerfile 指令详解 | Docker — 从入门到实践
使用docker可以很方便的迁移环境和复现实验,宿主机只需要用nvidia驱动就可以,不需要安装cuda/cudnn.
选择基础镜像
从dockerhub选择选择所需CUDA版本的基础镜像
nvidia/cuda Tags
FROM nvidia/cuda:11.6.1-runtime-ubuntu20.04
安装常用软件包和所需版本的python
USER root
ENV TZ=Asia/Shanghai
RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime \
&& echo $TZ >/etc/timezone \
&& apt-get update --yes \
&& apt-get install --yes --no-install-recommends \
gosu \
wget \
vim \
zip \
htop \
tmux \
python3.8 \
python3-pip \
zsh \
curl \
git \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* \
&& ln -s /usr/bin/python3 /usr/bin/python
直接通过apt
安装python
,不需要安装anaconda
,一个镜像一般只包含一种环境。根据自己需求可能还需要安装python3-dev
.
安装code-server(vscode网页版)
ENV CODE_VERSION=4.89.0
ENV PASSWORD=123456
RUN curl -fOL https://github.com/coder/code-server/releases/download/v$CODE_VERSION/code-server_${CODE_VERSION}_amd64.deb \
&& dpkg -i code-server_${CODE_VERSION}_amd64.deb \
&& rm -f code-server_${CODE_VERSION}_amd64.deb
通过环境变量设置密码。
安装torch和torchvision
RUN pip install --no-cache-dir --extra-index-url https://download.pytorch.org/whl/cu116 \
torch==1.13.1+cu116 \
torchvision==0.14.1+cu116
从pytorch官方源安装torch
和torchvision
,此处需要和cuda
版本对应。例如还有:
RUN pip install --no-cache-dir --extra-index-url https://download.pytorch.org/whl/cu118 \
torch==2.1.0+cu118 \
torchvision==0.16.0+cu118
创建容器内用户
RUN addgroup --gid 1000 dockeru && \
adduser --uid 1000 --ingroup dockeru --home /home/dockeru --shell /bin/zsh --disabled-password --gecos "" dockeru
RUN USER=dockeru && \
GROUP=dockeru && \
curl -SsL https://github.com/boxboat/fixuid/releases/download/v0.6.0/fixuid-0.6.0-linux-amd64.tar.gz | tar -C /usr/local/bin -xzf - && \
chown root:root /usr/local/bin/fixuid && \
chmod 4755 /usr/local/bin/fixuid && \
mkdir -p /etc/fixuid && \
printf "user: $USER\ngroup: $GROUP\n" > /etc/fixuid/config.yml
创建用户dockeru
,并在容器运行时(docker run)解决挂载目录的权限问题(详见解决 Docker 数据卷挂载的文件权限问题),这里借助了boxboat/fixuid. 同时终端也不会出现I have no name !
的问题,详见为什么bitnami 安装的软件进入容器,用户名都是I have no name.
以下是fixuid的工作流程
安装vscode扩展插件和ohmyzsh
USER dockeru
RUN EXT_LIST="ms-python.python ms-toolsai.jupyter ms-ceintl.vscode-language-pack-zh-hans equinusocio.vsc-material-theme" \
&& for EXT in $EXT_LIST; do code-server --install-extension $EXT; done \
&& sh -c "$(wget -O- https://github.com/deluan/zsh-in-docker/releases/download/v1.1.5/zsh-in-docker.sh)" -- \
-t robbyrussell
安装code-server的python、jupyter notebook、主题和语言包扩展。还有百用不厌的ohmyzsh,详见deluan/zsh-in-docker和Oh My Zsh. code-server中的python语言服务器不能使用Pylance
,因为其是闭源的,Pylance
只能在vscode中使用(详见issue 1938),code-server会自动选择Jedi
作为语言服务器。另外github theme
在code-server中使用会导致部分代码没有高亮颜色,所以这里选用material theme
.
安装python环境所需的依赖包
COPY requirements.txt /home/dockeru/requirements.txt
RUN echo 'export PATH=/home/dockeru/.local/bin:$PATH' >> /home/dockeru/.zshrc \
&& pip --no-cache-dir install -r /home/dockeru/requirements.txt \
&& rm -rf /tmp/* \
&& rm -rf /home/dockeru/.cache
这两个步骤是切换到dockeru
用户执行的,安装python扩展包和code扩展创建的文件都是属于dockeru
用户的。在镜像中,用户是有权进行pip uninstall
和code-server
的修改的。
在运行时处理home目录的权限问题
ENTRYPOINT ["fixuid"]
按照传入宿主机用户的-u UID:GID
参数,修改容器内dockeru
用户所属的UID
和GID
,修改dockeru
组的GID
,修改所有原来归属1000:1000
的文件到新传入宿主机用户的UID
和GID
,该命令会在终端输出所有处理文件的列表,当dockeru
用户目录中文件较多时,该过程可能会消耗较多时间。(详见issue 35)
启动code-server
EXPOSE 8080
CMD code-server --host 0.0.0.0 --locale=zh-cn
构建镜像
至此,Dockerfile
完成,可以在本地docke rbuild或者选择使用阿里云在Dockerfile中使用构建打包镜像并运行或者Github Action
进行远程构建。
docker build -t pytorch1.13_cuda11.6_py3.8 /构建上下文目录
运行容器
docker run \
-v /home/xxx/your_project:/code/your_project \
-v /mnt/sdx/your_dataset/:/your_dataset \
-u $(id -u):$(id -g) \
-p 18080:8080 \
--name xxx \
--runtime=nvidia --gpus all \
--shm-size 64g \
--restart always \
pytorch1.13_cuda11.6_py3.8
这里的-u $(id -u):$(id -g)
也可以是其他宿主机用户的-u $(id xxx -u):$(id xxx -g)
.
当出现code-server的启动日志,就可以在浏览器打开vscode了。
fixuid: chown /home/dockeru/.oh-my-zsh/themes/xiong-chiamiov-plus.zsh-theme
fixuid: chown /home/dockeru/.oh-my-zsh/themes/xiong-chiamiov.zsh-theme
fixuid: chown /home/dockeru/.oh-my-zsh/themes/ys.zsh-theme
fixuid: chown /home/dockeru/.oh-my-zsh/themes/zhann.zsh-theme
fixuid: chown /home/dockeru/.oh-my-zsh/tools
fixuid: chown /home/dockeru/.oh-my-zsh/tools/changelog.sh
fixuid: chown /home/dockeru/.oh-my-zsh/tools/check_for_upgrade.sh
fixuid: chown /home/dockeru/.oh-my-zsh/tools/install.sh
fixuid: chown /home/dockeru/.oh-my-zsh/tools/require_tool.sh
fixuid: chown /home/dockeru/.oh-my-zsh/tools/theme_chooser.sh
fixuid: chown /home/dockeru/.oh-my-zsh/tools/uninstall.sh
fixuid: chown /home/dockeru/.oh-my-zsh/tools/upgrade.sh
fixuid: chown /home/dockeru/.profile
fixuid: chown /home/dockeru/.wget-hsts
fixuid: chown /home/dockeru/.zcompdump
fixuid: chown /home/dockeru/.zshrc
[2024-05-16T03:18:34.254Z] info code-server 4.89.0 ab4b36f573c6d336dd79efa7859ed922fa00f81b
[2024-05-16T03:18:34.255Z] info Using user-data-dir /home/dockeru/.local/share/code-server
[2024-05-16T03:18:34.262Z] info Using config file /home/dockeru/.config/code-server/config.yaml
[2024-05-16T03:18:34.263Z] info HTTP server listening on http://0.0.0.0:8080/
[2024-05-16T03:18:34.263Z] info - Authentication is enabled
[2024-05-16T03:18:34.263Z] info - Using password from $PASSWORD
[2024-05-16T03:18:34.263Z] info - Not serving HTTPS
[2024-05-16T03:18:34.263Z] info Session server listening on /home/dockeru/.local/share/code-server/code-server-ipc.sock
打开网页http://你的服务器IP:18080
,输入设置的密码,就可以想在本地使用vscode一样使用code-server了,不需要通过remote-ssh
或者devcontainer
进行远程连接,只需要一个浏览器就可以。
这里需要设置一下浏览器的Insecure origins treated as secure
,不然http
会影响code-server的使用(剪贴板、图片、jupyter notebook异常)。
注意: 容器内的/code/your_project
和/your_dataset
目录就是宿主机的,所以对其的更改是直接体现在宿主机上的,而对其他目录的更改不是持久化的,在容器删除之后就没有了。
完整的dockerfile详见:Dreamupers/aliyuncontainer