Fauxpilot 手工安装指南

短文 ? 次阅读

Fauxpilot 是一款开源的、旨在替代 GitHub Copilot 的 AI 代码补全引擎。官方推荐的安装方式自然是 docker,但因为某些原因我难以使用此方法安装,因此决定根据其所需的各项依赖手工安装 fauxpilot。具体来说,是安装在 WSL Ubuntu 上,当然这个方案在所有 Linux 系统中应该都是通用的。

我原先拟的回答(英文,发表于 2023 年 4 月):How to install without docker?

步骤概述

  1. 安装 triton-server
  2. 安装 fasttransformer_backend
  3. 配置 fauxpilot 脚本与模型

安装 triton-server

仓库地址为:GitHub 仓库

镜像外依赖项安装

首先在根目录下执行如下命令,生成 Docker 构建文件:

./build.py -v --enable-all

随后检查 build 目录下的 Dockerfile.buildbase 文件,从中抽取安装各个依赖项的命令。

用 apt 安装常用软件

实际上下面包中与容器相关的可以跳过,这里为简便直接粘贴原来的所有包:

sudo apt update
sudo apt install -y --no-install-recommends ca-certificates autoconf automake build-essential docker.io git libre2-dev libssl-dev libtool libboost-dev libcurl4-openssl-dev libb64-dev patchelf python3-dev python3-pip python3-setuptools rapidjson-dev scons software-properties-common unzip wget zlib1g-dev libarchive-dev pkg-config uuid-dev libnuma-dev

这些包中,有一些是常见包,可能已经安装过了。

用 pip 安装基本包

pip3 install --upgrade pip
pip3 install --upgrade wheel setuptools docker

其中 docker 包似乎可以跳过。

安装较新的 cmake

Ubuntu 主仓库当中的 cmake 版本稍旧,不适应本次编译的需要。由此,通过以下代码安装较新版本的 cmake

wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null |       gpg --dearmor - |        tee /etc/apt/trusted.gpg.d/kitware.gpg >/dev/null
sudo apt-add-repository 'deb https://apt.kitware.com/ubuntu/ focal main'
sudo apt update
sudo apt install -y --no-install-recommends cmake-data=3.21.1-0kitware1ubuntu20.04.1 cmake=3.21.1-0kitware1ubuntu20.04.1

安装 Anaconda

由于本机上已安装 Anaconda,这里跳过。仅粘贴相关代码,供以后需要:

wget "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.12.0-Linux-x86_64.sh" -O miniconda.sh -q
echo "3190da6626f86eee8abf1b2fd7a5af492994eb2667357ee4243975cdbb175d7a" "miniconda.sh" > shasum
sha256sum -c ./shasum
sudo sh miniconda.sh -b -p /opt/conda
sudo rm miniconda.sh shasum
sudo find /opt/conda/ -follow -type f -name '*.a' -delete
sudo find /opt/conda/ -follow -type f -name '*.js.map' -delete
sudo /opt/conda/bin/conda clean -afy

另外,可以注意到这里是用 root 身份在 /opt 目录下安装系统级的 Anaconda,与本机上安装的用户级有所区别。

镜像内依赖项安装

以上依赖项抽取自 Dockerfile.buildbase,属于拉取镜像以后额外补充的依赖项。在此之外,还需补齐其所构建时采用的 NGC 镜像当中缺少的基本库,包括:

  • CUDA
  • cuDNN
  • TensorRT

安装 CUDA 环境

首先,确保本机上已经配置了 NVIDIA 的 CUDA 软件仓库,以获取最新版本的套件(Ubuntu 官方仓库中的版本很旧)。若未安装,先通过下列命令安装仓库公钥:

wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-keyring_1.0-1_all.deb
sudo dpkg -i cuda-keyring_1.0-1_all.deb

需要说明的是,之后可以到 /etc/apt/source.d/ 目录里去,把源文件当中的 nvidia.com 换成 nvidia.cn,提升下载速度。随后,通过以下命令安装 CUDA:

sudo apt update
sudo apt -y install cuda

安装完成之后,在 .bashrc 中通过以下命令将 CUDA 加入到 PATH 当中:

export PATH=/usr/local/cuda/bin${PATH:+:${PATH}}

完成以上配置后,可通过以下命令检查 CUDA 版本,应保证为 12 及以上:

nvcc --version

安装 cuDNN

配置好上述仓库之后,可直接通过以下命令安装 cuDNN:

sudo apt install libcudnn8 libcudnn8-dev

安装 TensorRT

注意:由于实际上只需要编译 triton-server 本身,不需要编译它所提供的默认 backend,因此实际上也就不需要安装 TensorRT 了。这里保留之前尝试的内容,仅供参。

以下内容粘贴自 Tensor RT 仓库中的相关说明。

首先,通过NVIDIA 开发者页面下载 NVIDIA TensorRT 的 EA 发行包,可能需要注册。请下载适用于 Linux x86_64 架构且对应于 CUDA 12.0 的 tar 包,下载完成之后将其解压,并设置到环境变量当中:

# 假设下载于 Downloads 目录当中
cd ~/Downloads
tar -xvzf TensorRT-8.6.0.12.Linux.x86_64-gnu.cuda-12.0.tar.gz
export TRT_LIBPATH=`pwd`/TensorRT-8.6.0.12/lib  # 注意这个路径,页面上写的不对

注意上述的路径问题,参考这个 issue 。随后,克隆 TensorRT 的开源代码库:

# 假设在常用代码目录下,省去 cd 环节
git clone -b main https://github.com/nvidia/TensorRT TensorRT
cd TensorRT
git submodule update --init --recursive
export TRT_OSSPATH=`pwd`

然后,可再次对照仓库页面上的说明,确认各个依赖项都已齐全。之后可首先 cmake 出相应的构建环境:

cd $TRT_OSSPATH
mkdir -p build && cd build
cmake .. -DTRT_LIB_DIR=$TRT_LIBPATH -DTRT_OUT_DIR=`pwd`/out -DCUDA_VERSION=12.0

对照输出的各项参数,确认没有遗失的依赖项。确认无误之后,直接进行 make

make -j8

另外据观察,在编译过程中还连接网络自动下载了 protobuf 包。

安装 Triton Server

首先克隆 triton-server 的源代码。对照 moyix/fastertransformer_backendDockerfile 当中所用的容器版本,采用浅拷贝方式获取对应于 NGC 容器 22.06 版本的 v2.23.0 版本代码:

git clone --depth=1 -b v2.23.0 https://github.com/moyix/fastertransformer_backend/blob/main/docker/Dockerfile

下载完成之后进入仓库,通过以下命令开始编译代码。由于以上还缺少一些相关的依赖(并且也用不上),因此根据 build.py 脚本的说明采取以下的自定义参数执行:

./build.py -v --enable-logging --enable-stats --enable-gpu --enable-tracing --endpoint=http --endpoint=grpc --no-container-build --build-dir=`pwd`/build

命令的核心是 --no-container-build,即取消对于 Docker 容器的相关处理。另外,以上参数中并没有包含任何的 backend,因为最终要使用的是 FasterTransformer 所实现的 backend,不需要使用由 NVIDIA 提供的那些官方 backend(安装也会出问题,像 ONNX 等依赖在这里都没有安装)。

安装过程中的唯一障碍是 grpc 的安装过程中会 clone 大量的 third_party,易受网络波动影响,这个只有自己酌情解决,可参阅这篇专栏中的指引。安装完成之后,可在 server/build/tritonserver/install/bin 目录下找到 server 的可执行文件 tritonserver。最后,将编译好的文件拷贝到 /opt 目录下备用:

# 假设当前在 triton server 项目根目录下
sudo cp -r build/opt/tritonserver /opt

安装 fastertransformer_backend

仓库目录为:https://github.com/moyix/fastertransformer_backend

安装依赖包

参考 Dockerfile 中的步骤,安装以下依赖包:

sudo apt update
sudo apt install -y --no-install-recommends zip unzip wget build-essential autoconf autogen gdb rapidjson-dev
sudo apt install -y --no-install-recommends libopenmpi-dev  # 安装 openmpi

编译及安装 backend

按上方地址克隆仓库,进入后执行下列命令执行构建:

export NVIDIA_TRITON_VERSION=22.06
cmake \
      -D SM=60,61,70,75,80,86 \
      -D CMAKE_EXPORT_COMPILE_COMMANDS=1 \
      -D CMAKE_BUILD_TYPE=Release \
      -D CMAKE_INSTALL_PREFIX=/opt/tritonserver \
      -D TRITON_COMMON_REPO_TAG="r${NVIDIA_TRITON_SERVER_VERSION}" \
      -D TRITON_CORE_REPO_TAG="r${NVIDIA_TRITON_SERVER_VERSION}" \
      -D TRITON_BACKEND_REPO_TAG="r${NVIDIA_TRITON_SERVER_VERSION}" \
      ..
make -j8
sudo make install

我安装过程中检测到 NCCL 没有安装,仔细检查了一下,发现原来是因为之前安装 cuda 时使用的是给 WSL 配置的软件包仓库,里面并没有 NCCL 的相关环境。此时既可以直接把 Ubuntu 22.04 的 CUDA 仓库给添加进来,然后直接用 apt 安装,也可以在NVIDIA 官网上下载本地安装包。无论如何,通过以下命令安装 nccl

sudo apt update
sudo apt install libnccl2=2.17.1-1+cuda12.1 libnccl-dev=2.17.1-1+cuda12.1 

执行完 sudo make install 命令后,编译好的文件会自动合并到之前的 /opt/tritonserver 目录里去。

安装 fauxpilot

安装模型运行环境

首先安装 Pytorch 环境:

pip install torch
pip install -U bitsandbytes transformers accelerate

启动 triton server

fauxpilot 的根目录下,可通过如下语句启动 server:

source .env
CUDA_VISIBLE_DEVICES=${GPUS} mpirun -n 1 --allow-run-as-root /opt/tritonserver/bin/tritonserver --model-repository=${MODEL_DIR}

不过,注意这里的 .env 需要先通过 setup.sh 脚本生成,模型也需要通过该脚本下载,或者利用之前安装时已下载的模型目录。启动成功后,将通过 8000 (http) / 8001 (grpc) 等端口提供服务。

启动 copilot_proxy

切换至 fauxpilot/copilot_proxy 目录下,首先安装依赖包:

pip install -r requirements.txt

随后可以启动 uvicorn 的 API 反代:

uvicorn --host 0.0.0.0 --port 5000 app:app

启动时出现异常,原因是 copilot_proxy/utils/codegen.py 当中有一处用镜像内绝对路径编写的语句,将其改为相对路径即可。再启动,就没有异常了。另外,注意修改一下 host 等信息。