AI 六月 18, 2023

GitHub Copilot 开源替代品 —— FauxPilot

文章字数 7k 阅读约需 6 mins. 阅读次数

用 PaddleNLP 结合 CodeGen 实现离线 GitHub Copilot 介绍了使用 PaddleNLP + CodeGen 实现类似 GitHub Copilot 服务端的方式,客户端在 VSCode 中使用了 FauxPilot 插件。

FauxPilot 插件原本是对接 FauxPilot Server 的,通过 FauxPilot Server 也可以实现 GitHub Copilot 服务的功能,并支持多显卡加载 CodeGen 模型,可解决单卡显存不足又想加载大模型的问题。

例如 FauxPilot 提供的 codegen-16B-multi-gptj 模型需要 32G 显存,你有两张 24G 显存的显卡,可以使用每张显卡 16G 左右的显存,成功加载 16B 模型。

最终效果

还是先展示一下最终的效果:

Prerequisite

FauxPilot 的环境需求可见 Prerequisites,包括:

  • Docker
  • docker compose >= 1.28
  • NVIDIA GPU 算力 >= 6.0 和足够模型使用的显存
  • nvidia-docker
  • curlzstd 命令行工具用来下载和解压模型文件

Nvidia container toolkit 的离线安装方式可参考 用 PaddleNLP 结合 CodeGen 实现离线 GitHub Copilot 一文的前置条件中相关内容。

FauxPilot Server 部署

如果是联网环境,可参照 How to set-up a FauxPilot server 通过 setup.sh 下载模型并直接启动服务,或在完成配置后,使用 launch.sh 脚本启动服务。

FasterTransformer backend 和 Python backend 中推荐选择 FasterTransformer backend。

服务启动时,会通过 Docker Compose,按照 docker-compose.yaml 的配置,以及 proxy.Dockerfiletriton.Dockerfile 构建两个镜像:

  • fauxpilot-main-copilot_proxy:latest
  • fauxpilot-main-triton:latest

故在离线环境部署时,只需将在线环境构建好的上面两个镜像导出:

$ docker save > fauxpilot-triton.tar fauxpilot-main-triton
$ docker save > fauxpilot-proxy.tar fauxpilot-main-copilot_proxy

再在离线环境导入:

$ docker load < fauxpilot-triton.tar
$ docker load < fauxpilot-proxy.tar

然后将下载好的模型文件目录、docker-compose.yaml 和执行 setup.sh 后生成的 .env 文件传入离线环境:

$ tree -a
├── .env
├── docker-compose.yaml
└── models
    └── codegen-16B-multi-2gpu
        └── fastertransformer
            ├── 1
            │   └── 2-gpu
            │       ├── config.ini
            │       ├── model.final_layernorm.bias.bin
            |       ├── ...
            │       └── model.wte.bin
            └── config.pbtxt

根据实际情况调整 .env 文件中的 MODEL_DIRHF_CACHE_DIR 为离线环境路径,并将 docker-compose.yamlbuild 部分改为直接使用镜像:

version: '3.3'
services:
  triton:
    image: fauxpilot-main-triton:latest
    command: bash -c "CUDA_VISIBLE_DEVICES=${GPUS} mpirun -n 1 --allow-run-as-root /opt/tritonserver/bin/tritonserver --model-repository=/model"
    shm_size: '2gb'
    volumes:
      - ${MODEL_DIR}:/model
      - ${HF_CACHE_DIR}:/root/.cache/huggingface
    ports:
      - "8000:8000"
      - "${TRITON_PORT}:8001"
      - "8002:8002"
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
  copilot_proxy:
    # For dockerhub version
    image: fauxpilot-main-copilot_proxy:latest
    command: uvicorn app:app --host 0.0.0.0 --port 5000
    env_file:
      # Automatically created via ./setup.sh
      - .env
    ports:
      - "${API_EXTERNAL_PORT}:5000"

之后直接通过 Docker Compose 启动即可:

$ docker compose up

客户端

FauxPilot Server 启动成功后,可按 用 PaddleNLP 结合 CodeGen 实现离线 GitHub CopilotFauxpilot VSCode Plugin 部分配置 VSCode 插件使用,也可直接通过 RESTful API 试用:

$ curl -s -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"prompt":"def hello","max_tokens":100,"temperature":0.1,"stop":["\n\n"]}' http://localhost:5000/v1/engines/codegen/completions
{"id": "cmpl-R6DqtyLigNJVJzt4F617KoM3EjB9M", "model": "codegen", "object": "text_completion", "created": 1686646299, "choices": [{"text": "(self):\n        return \"Hello World\"", "index": 0, "finish_reason": "stop", "logprobs": null}], "usage": {"completion_tokens": 11, "prompt_tokens": 2, "total_tokens": 13}}

接口结构参照 https://platform.openai.com/docs/api-reference/completions/create

请求体结构:

{
  "model": "text-davinci-003",
  "prompt": "Say this is a test",
  "max_tokens": 7,
  "temperature": 0,
  "top_p": 1,
  "n": 1,
  "stream": false,
  "logprobs": null,
  "stop": "\n"
}

响应体结构:

{
  "id": "cmpl-uqkvlQyYK7bGYrRHQ0eXlWi7",
  "object": "text_completion",
  "created": 1589478378,
  "model": "text-davinci-003",
  "choices": [
    {
      "text": "\n\nThis is indeed a test",
      "index": 0,
      "logprobs": null,
      "finish_reason": "length"
    }
  ],
  "usage": {
    "prompt_tokens": 5,
    "completion_tokens": 7,
    "total_tokens": 12
  }
}
0%