tritonserver学习之二:tritonserver编译

tritonserver学习之一:triton使用流程

tritonserver学习之三:tritonserver运行流程

tritonserver学习之四:命令行解析过程

tritonserver学习之五:backend实现机制 

1. 编译脚本生成流程

triton的编译脚本位于server代码库,文件为:

build.py

triton编译参数众多,很多参数也没搞清楚是什么用处,建议直接使用--enable-all参数,其他参数不设置,默认即可,但是这样操作也有一个不好,就是在不修改编译脚本的前提下,编译过程复杂,因此可以按需去修改一下代码,对编译进行一个裁剪,在修改、调试编译代码过程中,这里有个小窍门,运行build.py时,使用--dryrun参数,增加这个参数后,不会真正的执行编译,生成所有编译脚本后就会停止:

这样能大大提高调试效率,运行脚本后,会在当前文件夹下创建:build文件夹,并有5个新文件产生,分别为:cmake_build、docker_build、Dockerfile、Dockerfile.buildbase、Dockerfile.cibase,其中docker_build为执行编译过程的入口,整体build.py的执行流程如下:

tritonserver学习之二:tritonserver编译_第1张图片

2、编译执行流程

编译执行的入口文件为docker_build:

#!/usr/bin/env bash

# 
# Docker-based build script for Triton Inference Server
# 

# Exit script immediately if any command fails
set -e

########
# Create Triton base build image
# This image contains all dependencies necessary to build Triton
# 
cd /root/tritonserver/server
docker build -t tritonserver_buildbase -f /root/tritonserver/server/build/Dockerfile.buildbase --pull --cache-from=tritonserver_buildbase --cache-from=tritonserver_buildbase_cache0 --cache-from=tritonserver_buildbase_cache1 . 

########
# Run build in tritonserver_buildbase container
# Mount a directory into the container where the install
# artifacts will be placed.
# 
if [ "$(docker ps -a | grep tritonserver_builder)" ]; then  docker rm -f tritonserver_builder; fi
docker run -w /workspace/build --name tritonserver_builder -it -v /var/run/docker.sock:/var/run/docker.sock tritonserver_buildbase ./cmake_build 
docker cp tritonserver_builder:/tmp/tritonbuild/install /root/tritonserver/server/build 
docker cp tritonserver_builder:/tmp/tritonbuild/ci /root/tritonserver/server/build 

########
# Create final tritonserver image
# 
cd /root/tritonserver/server
docker build -t tritonserver -f /root/tritonserver/server/build/Dockerfile . 

########
# Create CI base image
# 
cd /root/tritonserver/server
docker build -t tritonserver_cibase -f /root/tritonserver/server/build/Dockerfile.cibase . 

执行流程如下:

tritonserver学习之二:tritonserver编译_第2张图片

3、执行编译

编译机器:pc机,ubuntu2004,显卡:gt1660ti

执行编译的过程需要占用大量的硬盘,大概55-60G左右,执行本次编译的build.py脚本代码如下:

编译过程耗时大概3个小时左右,整个编译还是有很大的优化空间的,思路上就是将三方依赖提前下载后,并打包到基础镜像中,这样编译耗时应该是可以降下来的。

       编译完成后,会生成tritonserver_buildbase镜像,这个就是用来编译的镜像,可以修改以下build.py,我们直接使用这个作为基础镜像,系统依赖可以不用重复下载,编译的效率可以持续的进行优化。

tritonserver学习之二:tritonserver编译_第3张图片

4、新探索

为了降低编译耗时,因此还是按照上面说的思路,先构建tritonserver_build镜像,之后在该镜像中执行cmake_build脚本,其中:

制作tritonserver_build镜像(cpu版本)耗时:大概35分钟左右。

基础镜像构建完成后,进入镜像,执行cmake_build脚本,编译triton,当前最新版本2.41编译成功了,硬盘空间总占用50G左右,启动镜像命令如下:

docker run -it --rm -v /var/run/docker.sock:/var/run/docker.sock -v /home/liupeng/study/triton/server:/workspace tritonserver_buildbase bash

这个命令的含义为(来自文心一言):

这个命令是一个 docker run 命令,用于启动一个新的 Docker 容器。我会为你逐一解释这个命令的各个部分:

docker run: 这是 Docker 的基本命令,用于从指定的镜像创建并启动一个新的容器。

-it: 这是两个参数的组合。

-i 表示交互模式,让你可以与容器进行交互。
-t 为容器分配一个伪终端或终端,这使得你可以像在常规终端中一样与容器进行交互。
--rm: 这个标志表示当容器退出时,自动删除该容器。这是一个很好的做法,特别是当你不需要保留容器历史或持久数据时。

-v /var/run/docker.sock:/var/run/docker.sock: 这是一个 volume 挂载指令,它挂载了宿主机的 /var/run/docker.sock 到容器的相同位置。这意味着容器可以与宿主机上的 Docker守护进程通信。

-v /home/liupeng/study/triton/server:/workspace: 这是另一个 volume 挂载指令。它将宿主机的 /home/liupeng/study/triton/server 目录挂载到容器的 /workspace 目录。这意味着容器内的 /workspace 目录将反映宿主机上的相应目录的内容。

tritonserver_buildbase: 这是你要运行的 Docker 镜像的名称。

bash: 这是在容器内部启动的命令。在这里,它启动了 bash shell。

综上所述,这个命令的目的是从 tritonserver_buildbase 镜像启动一个新的 Docker 容器,并在容器内启动 bash shell。同时,该容器与宿主机上的 Docker守护进程通信,并使用宿主机上的 /home/liupeng/study/triton/server 目录作为其工作空间。

执行编译的耗时大约在1个小时,没有具体统计,backend只编译了以下几个:

all_backends = [
    "ensemble",
    # "identity",
    # "square",
    # "repeat",
    "tensorflow",
    # "onnxruntime",
    "python",
    # "dali",
    "pytorch",
    # "openvino",
    # "fil",
    # "tensorrt",
]

编译pytorch/tensorflow是在镜像中进行的,所以编译完成后,会新生成两个镜像:

tritonserver学习之二:tritonserver编译_第4张图片

启动成功了,太棒了:

tritonserver学习之二:tritonserver编译_第5张图片

编译成功一次后,会有缓存,只修改triton的代码进行编译,相对来说编译会很快,一次大概15分钟。

小窍门:制作tritonserver_build完成后,启动镜像时,把本地的代码映射进去,就可以随时修改,随时编译,比较方便。

制作好的tritonserver_build镜像,托管到了阿里云的平台:registry.cn-beijing.aliyuncs.com/mianhuatang-liupeng/triton,大家可自取。

你可能感兴趣的:(学习,c++)