docker 构建 TensorRT 指定版本 image

docker 构建 TensorRT 指定版本 image

tensorrt——相关库的说明

Tensorrt
这是github上tensorrt的一个项目库。其介绍为:这个存储库包含了NVIDIA TensorRT的开源软件(OSS)组件。包括TensorRT插件和解析器(Caffe和ONNX)的源代码,以及演示TensorRT平台的用法和功能的样例应用程序。这些开放源码软件组件是TensorRT通用可用性(GA)发行版的一个子集,带有一些扩展和错误修复。简单来说,该仓库就是tensorrt GA的子集+拓展+例子,不能脱离 tensorrt GA

tensorrt GA
这才是tensorrt的核心库文件,所以上面github上的库,需要他才能编译

onnx-tensorrt
将onnx模型转换成tensorrt的模型的一个库,需要上面的 tensorrt GA 才能编译,不需要上文的第一个。

下载 TensorRT OSS v8.4.1 GA 源码

wget https://github.com/NVIDIA/TensorRT/archive/refs/tags/8.4.1.tar.gz
# 解压:
tar -xvzf TensorRT-8.4.1.Linux.x86_64-gnu.cuda-11.6.cudnn8.4.1.tar.gz
export TRT_LIBPATH=`pwd`/TensorRT-8.4.1

设置构建环境, 使用下面的命令创建一个images

cd TensorRT-8.4.1
./docker/build.sh --file docker/ubuntu-20.04.Dockerfile --tag tensorrt-ubuntu20.04-cuda11.6

构建完查看

docker images

以 tensorrt-ubuntu20.04-cuda11.6 为image 起容器,修改镜像

docker run --gpus all --name test_trt8.4 -it -v /root:/root tensorrt-ubuntu20.04-cuda11.6

会报如下错:

docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]]

解决方案:

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker

进入容器后
由于是自己基于TensorRT仓库创建的仓库,则需要自己编译TensorRT相关的test case

cd TensorRT-8.4.1
rm -rf /root/TensorRT-8.4.1/parsers/onnx
git clone https://github.com/onnx/onnx-tensorrt.git
cd onnx-tensorrt 
git submodule update --init --recursive
cd ..
mv onnx-tensorrt  onnx 
mkdir build  && cd build
cmake ..
make -j100

# 将编译好的库和执行文件放到PATH路径中去,方便命令行直接使用
# 自己创建好的container,初始 sudo 密码为 nvidia
# check PATH 和 LD_LIBRARY_PATH
echo $LD_LIBRARY_PATH
echo $PATH
sudo mkdir -p /usr/local/nvidia/lib
sudo mkdir -p /usr/local/nvidia/bin
sudo cp *.so.* /usr/local/nvidia/lib
sudo cp trtexec /usr/local/nvidia/bin

将所做的改动基于初始的镜像,生成一个新的镜像,方便其他人使用

# 上面所使用的容器ID为:df33d7d28d3a
# 创建新的镜像, docker commit -m="描述消息" -a="作者" 容器ID或容器名 镜像名:TAG
docker commit -m="add TensorRT OSS" -a="michael" df33d7d28d3a michael/tensorrt:8.4

# 检查是否成功创建
docker images

# 使用新的镜像,生成一个容器,进行测试
docker run --gpus all -it michael/tensorrt:8.4

创建最新版本的TensorRT docker,如果Nvidia Docker images里面已经有最新的,则可以直接使用

# 安装TensorRt镜像
docker pull nvcr.io/nvidia/tensorrt:21.11-py3
// 上面的命令给出了Docker镜像仓库地址 nvcr.io
// 仓库名为 nvidia/tensorrt
// 标签为 21.11-py3

# 使用TensorTt镜像创建一个容器,其中local_dir是共享到容器的目录
docker run --gpus all -it -v local_dir:container_dir nvcr.io/nvidia/tensorrt:21.11-py3

将新构建的docker image 导出导入(export、import、save、load)

有时我们需要将一台电脑上的镜像复制到另一台电脑上使用,除了可以借助仓库外,还可以直接将镜像保存成一个文件,再拷贝到另一台电脑上导入使用。对于镜像的导出和导入,Docker 提供了两种方案,下面分别进行介绍。

一、使用 export 和 import
查看本机的容器
这两个命令是通过容器来导入、导出镜像。首先我们使用 docker ps -a 命令查看本机所有的容器。

导出镜像
使用 docker export 命令根据容器 ID 将镜像导出成一个文件。

docker export f299f501774c > hangger_server.tar

上面命令执行后,可以看到文件已经保存到当前的 docker 终端目录下。

导入镜像
使用 docker import 命令则可将这个镜像文件导入进来。

docker import - new_hangger_server < hangger_server.tar

执行 docker images 命令可以看到镜像确实已经导入进来了。

二、使用 save 和 load
查看本机的容器
这两个命令是通过镜像来保存、加载镜像文件的。首先我们使用 docker images 命令查看本机所有的镜像。

保存镜像
下面使用 docker save 命令根据 ID 将镜像保存成一个文件。

docker save 0fdf2b4c26d3 > hangge_server.tar

我们还可以同时将多个 image 打包成一个文件,比如下面将镜像库中的 postgres 和 mongo 打包:

docker save -o images.tar postgres:9.6 mongo:3.4

载入镜像
使用 docker load 命令则可将这个镜像文件载入进来。

docker load < hangge_server.tar

两种方案的差别:

特别注意:两种方法不可混用。
如果使用 import 导入 save 产生的文件,虽然导入不提示错误,但是启动容器时会提示失败,会出现类似"docker: Error response from daemon: Container command not found or does not exist"的错误。

  1. 文件大小不同
    export 导出的镜像文件体积小于 save 保存的镜像

  2. 是否可以对镜像重命名
    docker import 可以为镜像指定新名称
    docker load 不能对载入的镜像重命名

  3. 是否可以同时将多个镜像打包到一个文件中
    docker export 不支持
    docker save 支持

  4. 是否包含镜像历史
    export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作。
    而 save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。

  5. 应用场景不同
    docker export 的应用场景:主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。
    docker save 的应用场景:如果我们的应用是使用 docker-compose.yml 编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使用 docker load 载入。

docker容器commit之后变得非常大的原因及解决办法
https://blog.csdn.net/weixin_43220532/article/details/123848167


参考:
https://www.hangge.com/blog/cache/detail_2411.html
https://www.cnblogs.com/dotnet261010/p/13283176.html

posted @ 2022-09-07 19:56  michaelchengjl  阅读(1333)  评论(0编辑  收藏  举报