DockerでTabbyをデプロイする方法:開発チーム向けセルフホスト型AIコード補完

AI tutorial - IT technology blog
AI tutorial - IT technology blog

背景と導入のメリット

独自のソースコードをサードパーティのAPIに送信することは、SOC 2、HIPAA、またはクライアントとのNDA(秘密保持契約)などの厳格な要件を抱える開発チームにとって重大なリスクとなります。GitHub Copilotのようなツールは日々の開発効率を大きく向上させますが、企業のコンプライアンスポリシーによって利用が全面的に禁止されているケースも少なくありません。

Tabbyはこの課題を解決します。Tabbyはプライベートネットワーク内で完全に動作するオープンソースのセルフホスト型AIコーディングエンジンです。RTX 3060を搭載したオンプレミスのワークステーションや専用GPUサーバー、または分離されたAWS EC2インスタンス(g5.xlargeなど)上で稼働させることができます。VS Code、IntelliJ、Vim向けの公式プラグインが提供されているほか、ローカルのGitリポジトリをインデックス化することで、社内APIに最適化された補完候補を提示できます。

Docker経由でTabbyをデプロイすることで、データ漏洩リスクをゼロにし、ユーザーあたり月額19ドルの継続的なライセンス費用を削減できます。12のマイクロサービスを対象とした社内テストでは、チームメンバーによる補完の採用率は約28%に達し、商用サービスに匹敵する成果が得られました。

インストール

ホストマシンにDocker EngineおよびDocker Composeがインストールされている必要があります。基本的なテストであればCPU推論も可能ですが、本番運用には8GB以上のVRAMを搭載したNVIDIA GPUが不可欠です。これにより、インライン補完のレイテンシを120ms未満に抑え、快適なタイピング感覚を実現できます。

1. NVIDIA Container Toolkitの確認(GPUホスト向け)

Dockerがグラフィックボードと正常に通信できるか確認します:

nvidia-smi
docker run --rm --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi

出力結果にGPUモデルとドライバーのバージョンが表示されれば、コンテナランタイムの準備は完了です。

2. プロジェクトディレクトリの作成

モデルの重みとインデックス化されたリポジトリデータを永続化するためのディレクトリ構成を作成します:

mkdir -p ~/tabby-server/data && cd ~/tabby-server

3. docker-compose.ymlの作成

このディレクトリにdocker-compose.ymlファイルを作成します。以下の構成では、インライン補完用にQwen2.5-Coder-1.5B(VRAM約3GB使用)、サイドバーのチャット用にQwen2.5-Coder-7B(FP16/INT8でVRAM約6GB使用)を指定しています:

services:
  tabby:
    image: tabml/tabby:latest
    container_name: tabby-server
    restart: unless-stopped
    ports:
      - "8080:8080"
    volumes:
      - ./data:/data
    environment:
      - TABBY_DISABLE_USAGE_COLLECTION=1
    command: serve --model TabbyML/Qwen2.5-Coder-1.5B --chat-model TabbyML/Qwen2.5-Coder-7B --device cuda
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

専用GPUのないマシンでテストする場合は、軽量なCPUプロファイルを利用してください:

services:
  tabby:
    image: tabml/tabby:latest
    container_name: tabby-server-cpu
    restart: unless-stopped
    ports:
      - "8080:8080"
    volumes:
      - ./data:/data
    command: serve --model TabbyML/StarCoder-1B --device cpu

4. サーバーの起動

バックグラウンドでコンテナを起動します:

docker compose up -d

初回起動時、Tabbyは約4.5GBのモデルの重みを./dataに直接ダウンロードします。100Mbpsの回線環境では、ポートが開くまでにおよそ5〜7分程度かかります。

設定手順

1. 初期管理者設定の完了

ブラウザを開き、以下にアクセスします:

http://<サーバーのIPアドレス>:8080

初期画面でメインの管理者アカウントを作成します。このWebコンソールから、チームのアクセストークン、リポジトリ同期ジョブ、プロンプト設定などを管理します。

2. チーム用アクセストークンの発行

開発者に管理者権限の認証情報を共有してはいけません。代わりに専用のクライアントトークンを発行します:

  1. TabbyのWeb UIにログインします。
  2. Settings > Access Tokens に移動します。
  3. Generate Token をクリックし、チーム名またはエンジニア名を設定してトークン文字列をコピーします。

3. コンテキストインデックス用のGitリポジトリ連携

TabbyはTantivyベースのコードインデックス機能を使用し、社内ライブラリやユーティリティ関数を理解した補完を行います:

  1. 管理パネルの Repositories を開きます。
  2. 社内GitのURL(HTTPSまたはSSH)を追加します。プライベートなGitLabやGitHubリポジトリの場合は、読み取り専用のデプロイトークンを設定してください。
  3. Sync をクリックします。TabbyがASTを解析し、コード補完を妨げることなくバックグラウンドでセマンティックインデックスを構築します。

4. 開発者IDEの設定(VS Codeの例)

開発者は2分足らずでエディタの設定を完了できます:

  1. VS Code Marketplaceから Tabby 拡張機能をインストールします。
  2. 設定を開き(Ctrl+, または Cmd+,)、Tabby を検索します。
  3. Endpoint に http://<サーバーのIPアドレス>:8080(またはHTTPSリバースプロキシ経由の社内ドメイン)を設定します。
  4. Token フィールドに発行された開発者用トークンを貼り付けます。

動作確認とモニタリング

1. エディタ上での自動補完の確認

新規ファイル(metrics.py や auth.ts など)を開き、関数のヘッダーを記述します:

def calculate_rolling_retention(user_events: list[dict], cohort_days: int = 30) -> float:
    """指定された期間におけるコホート維持率を計算する。"""

80〜150ms以内にグレーのゴーストテキストがインラインで表示されます。Tab キーを押して補完候補を確定します。

2. サーバーログの確認

リクエストがバックエンドに届き、正常に推論が実行されているか確認します:

docker logs -f tabby-server

正常に動作していれば、/v1/completions に対して各プロンプトのレイテンシベンチマークとともに HTTP 200 OK のログが出力されます。

3. リソース使用状況の監視

利用するチームメンバーが増えるにつれて、ハードウェアの負荷状況を追跡します:

# GPUのVRAM割り当てと消費電力を監視
watch -n 2 nvidia-smi

# コンテナのCPUおよびRAM使用量を確認
docker stats tabby-server

4. よくある問題のトラブルシューティング

  • 初回プロンプト時の高レイテンシ: GPUメモリ内でKVキャッシュの初期化が行われているためです。2回目以降のリクエストは即座に通常の速度に戻ります。
  • CUDA Out of Memory (OOM) エラー: 複数のユーザーが同時にチャットリクエストを送信すると、VRAMが逼迫する場合があります。チャットモデルを無効化するか、補完モデルを Qwen2.5-Coder-0.5B に変更して対処してください。
  • Connection Refused エラー: ホストのファイアウォール設定を sudo ufw allow 8080/tcp で確認するか、Nginx/Caddyを介して適切にTLS終端を設定してください。
Share: