FauxPilotならGitHub Copilotの代わりにローカルでAIにコードを書かせられるよ

# なにこれ
- GitHub Copilotとほぼ同じ機能をローカルサーバーで実現できる[FauxPilot](https://github.com/fauxpilot/fauxpilot)を紹介したい
- VSCodeでの使用感を見せたい

# 使用例
- pytorchでmnistの分類を行うexampleを作る
<iframe width="560" height="315" src="https://www.youtube.com/embed/Juyl1v5nZK8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

# 環境
- FauxPilot
    ```bash: commit
    $ git show HEAD
    commit 58e2ac967394b58720ce9703063e794c0f3422e2 (HEAD -> main, origin/main, origin/HEAD)
    Merge: 8df5058 c2caa89
    Author: Parth Thakkar <thakkarparth007@gmail.com>
    Date:   Tue Jan 3 16:48:53 2023 +0530
    
        Merge pull request #136 from leemgs/upstream-setup-docker
        
        fix: improved the docker compose statement to handle various docker env
    ```
- docker
    ```bash: docker
    $ docker version
    Client: Docker Engine - Community
     Version:           20.10.22
     API version:       1.41
     Go version:        go1.18.9
     Git commit:        3a2c30b
     Built:             Thu Dec 15 22:28:08 2022
     OS/Arch:           linux/amd64
     Context:           default
     Experimental:      true
    
    Server: Docker Engine - Community
     Engine:
      Version:          20.10.22
      API version:      1.41 (minimum version 1.12)
      Go version:       go1.18.9
      Git commit:       42c8b31
      Built:            Thu Dec 15 22:25:58 2022
      OS/Arch:          linux/amd64
      Experimental:     false
     containerd:
      Version:          1.6.14
      GitCommit:        9ba4b250366a5ddde94bb7c9d1def331423aa323
     runc:
      Version:          1.1.4
      GitCommit:        v1.1.4-0-g5fd4c4d
     docker-init:
      Version:          0.19.0
      GitCommit:        de40ad0
    ```
- docker compose
    ```bash: docker compose
    $ docker compose version
    Docker Compose version v2.15.1
    ```
- ホストのCUDA
    ```bash: cuda
    $ nvcc -V
    nvcc: NVIDIA (R) Cuda compiler driver
    Copyright (c) 2005-2022 NVIDIA Corporation
    Built on Wed_Jun__8_16:49:14_PDT_2022
    Cuda compilation tools, release 11.7, V11.7.99
    Build cuda_11.7.r11.7/compiler.31442593_0
    ```
- GTX1080ti
- Ubuntu20.04

# FauxPilotって何？
- https://github.com/fauxpilot/fauxpilot
- 自動でソースコードを生成してくれる[GitHub Copilot](https://github.com/features/copilot)と同様に、例えばVSCodeからリアルタイムに次に入力すべきコードを提案してもらえます。
- GitHub Copilotとは違い、ローカルで実行できます。
- [GitLabのVSCode拡張機能](https://github.com/fauxpilot/fauxpilot/blob/main/documentation/client.md#gitlab---vs-code-extentension)でもcodeの提案に使われることになったそうです（が、具体的な方法は不明。[参考](https://about.gitlab.com/handbook/product/categories/#ai-assisted-group)）

# メリット
- オープンにしたくない自分のコードが取り込まれるのを防ぐ
    - 生成コードの予測のためには、現在書いているコードを送信する必要があります。GitHub CopilotはGitHubサーバーで動くので、コードが知らぬ間にオープンにされる可能性を否定しきれない一方、ローカルで実行するFauxPilotなら自分で管理できます。
    - GitHub Copilotの場合、[ここ](https://github.com/settings/copilot)で、自分のコードが利用されるかどうかの設定ができます。
- 電気代しかかからない
    - 無料期間があるとはいえ、お金を有用かわからないサービスに使うのは気が引ける…という気持ちはそこそこわかる。（ただし月10ドル/年100ドル）
    - FauxPilotを走らせる分の電気代はたぶん月1ドルもかからない。
- 複数・古いGPUが活かせる
    - 複数GPUに分けてモデルをのせられるので、使っていないGPUも使いみちが生まれます。

# 問題点
- GPUが必要
    - 最小モデルで2GBですが、少なくともCC>=6.0のGPUが必要。
- いつsuggestが出てくるかわからない
    - 文脈的に一義的でも、必ずしもsuggestされるわけではなく、改行されたらsuggestされるなど。
    - GitHub Copilotも同じく。
- 知らないうちに誰かのコードを使っている可能性
    - GitHub Copilot(Codexモデル)のトレーニングには大量のソースコードが使われていますが、トレーニングしたモデルはトレーニングに使ったソースコードを再生成しても何も不思議ではない。
    - GitHub Copilotなら、[ここ](https://github.com/settings/copilot)でpublic codeと一致するコードの提案をblockするかallowするかの設定ができます
- 新しいフレームワークの補完は難しい
    - 学習されていないため生成しにくいらしい。
- メモリは常時占有します
    - GPUを使う作業を並行する場合はちょっと考えものかもしれない

# インストール
## requirements
- モデルを保存できるストレージ
    - 最低2GB、最大32GB使います
- docker
    - docker compose >= 1.28
- GPU
    - 使用可能なGPUと、GPUごとの使用可能モデルの対応は[こちら](https://github.com/fauxpilot/fauxpilot/wiki/GPU-Support-Matrix)から確認できます。NVIDIA GPU with Compute Capability>=6.0が必須です。
    - ※原因未確認ですが、cuda11.6はlaunch.shがErrorで終了しました。cuda11.7に上げたところ動くようになりました。
- その他
    - curl
    - zstd

## セットアップ
- setup.sh
    ```bash: セットアップ
    # dockerが動くので、人によってはsudoが必要
    git clone https://github.com/fauxpilot/fauxpilot
    cd fauxpilot
    bash setup.sh
    ```

- 設定内容
    - 基本的にenterを叩いていればOK
    - Models availableのところだけ、自分のGPUのRAMサイズと用途に合わせたものを選ぶ必要がある
        - 私はGTX1080tiで、pythonでだけ動けばいいので、`[1] codegen-350MB-mono`を使います
        - 2GB Total VRAMとありますが、実際走らせてみると瞬間的に3GBまで増えました。コードの長さによるかと思います。

## サーバー起動
- launch.sh
    ```bash: サーバー起動
    bash launch.sh
    ```

## GitHub Copilot拡張機能でVSCodeから使う
- 拡張機能のインストール
    - [Github Copilot](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot)をインストールします
- settings.jsonに追記
    - settings -> Github > Copilot: Advanced -> Edit in settings.json
    - デフォルトでは5000番ポートでlaunchされます
    - vscodeを動かしているのと同じマシン上で動かすのならlocalhostで足りますが、うちでは別マシンで動いているので`http://[別マシンのIP]:5000`として使っています
    ```json: settings.json
    "github.copilot.advanced": {
        "debug.overrideEngine": "codegen",
        "debug.testOverrideProxyUrl": "http://localhost:5000",
        "debug.overrideProxyUrl": "http://localhost:5000"
    }
    ```

# 気になったこと
- commitメッセージの作成とかcode以外のところでの用途にも使えると嬉しい
- fastertransformer.ccで処理が停止する現象が複数回見られました。少し待っていると再度レスポンスが得られる状態に戻るので、辛抱強く待っていると良いかと思います。