实际应用
神经网络项目由x86cpu的linux环境移到arm cpu架构上运行,使用docker进行测试以及环境配置。
-
docker load -i 镜像压缩文件.tar
- docker load -i命令用于从一个压缩的镜像存档文件(通常是以.tar扩展名结尾)中加载镜像到本地Docker引擎中。
- docker load:加载一个本地的镜像。
- -i:指定输入文件,后面跟着要加载的镜像存档文件。
-
docker images 查看镜像
-
docker run --name 容器名 -it -e ASCEND_VISIBLE_DEVICES=0 -p 1234:5678 镜像id /bin/bash
- docker run:运行一个新的容器。
- -it:使用交互式终端运行容器,其中-i表示交互式,-t表示分配一个伪终端。
- -e ASCEND_VISIBLE_DEVICES=0。环境变量选择使用哪个NPU卡
- -p 1234:5678:端口映射,容器内部端口与宿主机端口进行映射
- /bin/bash:进入到容器的bash终端
-
docker rename 原名称 现名称
-
docker cp <source_path> <container_name>:<destination_path>
-
docker ps
- 查看正在运行的容器
-
docker ps -a
- 查看所有容器
-
docker start 容器名
-
dockers stop 容器名
-
docker rm 容器名
-
docker exec -it <container_name> <command>
- <container_name> 是要进入的容器的名称或ID。
- <command> 是要在容器内执行的命令。通常,我们使用/bin/bash或/bin/sh作为命令,以启动一个交互式Shell会话。
在Docker容器中安装NPU驱动固件(宿主机装了,docker可以不装)
- 在宿主机上已经安装了相应的NPU驱动和固件。
- 容器在创建时,需要与宿主机共享NPU设备。
- docker run --privileged -it -v /dev:/dev <image_name> bash
- --privileged参数来赋予容器特权,使其能够访问宿主机的设备。同时,使用-v /dev:/dev参数来共享宿主机的/dev目录,包括其中的设备文件。
ChatGLM部署华为arm服务器
- 安装toolkit工具包
- 容器内没安装NPU驱动固件,所以需要到.bashrc中配置环境变量
- 环境变量要加export xxx=xxxx
- 安装torch依赖
- 解压代码包
- 创建模型权重软链接
- 替换transformers的utils.py文件(可以先不做)
- 权重切分与执行
Docker架构
镜像(三类)
- 基础镜像
Ubuntu、Debian、CentOs、Windows、MacOs
- docker commit构建镜像
Docker commit 是将正在运行的容器保存为新的镜像的一种方法。将当前容器的状态快照成一个新的镜像。优点快速和方便,缺点占用空间大、冗余、效率低、可重复性弱、容易出错。
- 从镜像运行容器,实际上是在镜像顶部上加了一层可写层,所有对容器文件系统的修改,都在这一层中进行,不影响已经存在的层。从容器构建镜像,实际上是把容器的顶层固化到镜像中。镜像的体积只会增大,不会减小。
shell
# 将容器转换为镜像
docker commit 容器id 镜像名称:版本号
# 将镜像打包为压缩包,用于传输
docker save -o image_name.tar image_name
# 将镜像压缩包解压为镜像
docker load -i image_name.tar
- dockerfile构建镜像
Dockerfile 是一种文本文件,它包含了一系列指令和配置,用于自动化构建 Docker 镜像。优点灵活性和可重复性。比docker commit更具优势。
- 可重复性:使用 Dockerfile 可以完全复制镜像构建过程,确保每次构建的结果一致。
- 可扩展性:Dockerfile 允许您定义容器的多个层次,并在每个层次上进行构建和修改。轻松地添加、删除或更新组件。
- 可维护性:Dockerfile 是一个文本文件,可以与代码存储在同一版本控制系统中,并且可以通过版本控制工具进行追踪和管理。这使得团队成员可以共同协作和维护镜像构建过程。
容器
仓库
仓库可看成一个代码控制中心,用来保存镜像 Docker Hub(https://hub.docker.com)
dockerfile
shell
FROM acltransformer:base # ubuntu:18.04 指定父镜像,指定dockerfile基于哪个镜像进行创建以华为昇腾172.16.15服务器为例
RUN apt-get update && apt-get install -y \ # 执行命令
wget \
language-pack-zh-hans && \
mkdir /data
WORKDIR /data # 工作目录
COPY Dockerfile_dir ./Dockerfile_dir # 复制文件 这是个文件夹
WORKDIR /data/Dockerfile_dir/npu_tools
RUN /bin/bash Miniconda3-latest-Linux-aarch64.sh -b -p /opt/conda && \
echo 'export PATH="/opt/conda/bin:$PATH"' >> ~/.bashrc && \
RUN conda create -n py37 python=3.7
ENV PATH /opt/conda/envs/chatglm_py37/bin:$PATH # 环境变量
RUN /bin/bash npu_env.sh && \
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
ENTRYPOINT ["/bin/bash", "-c", "/opt/conda/envs/py37/bin/python3.7 main.py"] # 设置容器的入口点
在编写 Dockerfile 时,通常会遵循一个原则:尽可能使步骤少而有效。
- 减小镜像大小:每个步骤都会在镜像中创建一个新的层次,并增加镜像的大小。较少的步骤意味着较少的层次,从而减小了镜像的总体大小。
- 提高构建速度:每个步骤都需要执行一些操作,较少的步骤意味着较少的操作,从而减少了构建过程的时间。
- 简化维护和调试:较少的步骤意味着较少的代码和配置,使得维护和调试变得更加简单。
使用下面命令来用dockerfile创建docker镜像。
shell
docker build -t chatglm_npu:v2 -f Dockerfile .
docker build --platform linux/arm64/v8 -t chatglm_npu:v1 -f Dockerfile .
docker build --platform linux/amd64 -t dispatch:v1 -f Dockerfile .