• docker应用实例及dockerfile


    实际应用

    神经网络项目由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 :
    • docker ps
      • 查看正在运行的容器
    • docker ps -a
      • 查看所有容器
    • docker start 容器名
    • dockers stop 容器名
    • docker rm 容器名
    • docker exec -it
      • 是要进入的容器的名称或ID。
      • 是要在容器内执行的命令。通常,我们使用/bin/bash或/bin/sh作为命令,以启动一个交互式Shell会话。

    在Docker容器中安装NPU驱动固件(宿主机装了,docker可以不装)

    • 在宿主机上已经安装了相应的NPU驱动和固件。
    • 容器在创建时,需要与宿主机共享NPU设备。
      • docker run --privileged -it -v /dev:/dev 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 是将正在运行的容器保存为新的镜像的一种方法。将当前容器的状态快照成一个新的镜像。优点快速和方便,缺点占用空间大、冗余、效率低、可重复性弱、容易出错。

    • 从镜像运行容器,实际上是在镜像顶部上加了一层可写层,所有对容器文件系统的修改,都在这一层中进行,不影响已经存在的层。从容器构建镜像,实际上是把容器的顶层固化到镜像中。镜像的体积只会增大,不会减小。
    # 将容器转换为镜像
    docker commit 容器id 镜像名称:版本号
    # 将镜像打包为压缩包,用于传输
    docker save -o image_name.tar image_name
    # 将镜像压缩包解压为镜像
    docker load -i image_name.tar
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • dockerfile构建镜像

    Dockerfile 是一种文本文件,它包含了一系列指令和配置,用于自动化构建 Docker 镜像。优点灵活性和可重复性。比docker commit更具优势。

    • 可重复性:使用 Dockerfile 可以完全复制镜像构建过程,确保每次构建的结果一致。
    • 可扩展性:Dockerfile 允许您定义容器的多个层次,并在每个层次上进行构建和修改。轻松地添加、删除或更新组件。
    • 可维护性:Dockerfile 是一个文本文件,可以与代码存储在同一版本控制系统中,并且可以通过版本控制工具进行追踪和管理。这使得团队成员可以共同协作和维护镜像构建过程。

    容器

    仓库

    仓库可看成一个代码控制中心,用来保存镜像 Docker Hub(https://hub.docker.com)

    dockerfile

    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"] # 设置容器的入口点
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在编写 Dockerfile 时,通常会遵循一个原则:尽可能使步骤少而有效。

    • 减小镜像大小:每个步骤都会在镜像中创建一个新的层次,并增加镜像的大小。较少的步骤意味着较少的层次,从而减小了镜像的总体大小。
    • 提高构建速度:每个步骤都需要执行一些操作,较少的步骤意味着较少的操作,从而减少了构建过程的时间。
    • 简化维护和调试:较少的步骤意味着较少的代码和配置,使得维护和调试变得更加简单。

    使用下面命令来用dockerfile创建docker镜像。

    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 .
    
    • 1
    • 2
    • 3
  • 相关阅读:
    力扣:130. 被围绕的区域(Python3)
    基于Opencv c++图像三维空间旋转(使用二维旋转、缩放进行代替的方式---思路转换)
    力扣46:全排列(Java回溯)
    【Mybatis源码】源码分析
    深入浅出讲解Spring IOC和DI的区别
    基于java(ssm)个人健康管理系统
    副高级职称的要求真的很难达到吗?
    screenfull全屏、退出全屏、指定元素全屏的使用步骤
    数据结构-堆
    记录一个音频PCM数据由双声道转单声道出错问题
  • 原文地址:https://blog.csdn.net/shunjianxaioshi/article/details/134375502