利用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官方源安装torchtorchvision,此处需要和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-dockerOh 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 uninstallcode-server的修改的。

在运行时处理home目录的权限问题

ENTRYPOINT ["fixuid"]

按照传入宿主机用户-u UID:GID参数,修改容器内dockeru用户所属的UIDGID,修改dockeru组的GID,修改所有原来归属1000:1000的文件到新传入宿主机用户UIDGID,该命令会在终端输出所有处理文件的列表,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

  • 24
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

糖醋奶茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值