🚗

Dockerコンテナの中でAutoGPTを動かしてみた

2023/04/16に公開2

いま「自律駆動AI」として話題のAuto-GPT。自分のPCをコマンドラインツールとしてAIに使わせて思考させるという発想には興味がわきつつちょっとした怖さも憶えます。

Auto-GPTがどんな仕組みになっているかはこちらの記事で紹介しています。

https://zenn.dev/kecy/articles/7349a3969e2de6

自分のPCで直接動かすのは怖いので、Dockerコンテナ内で動かしてみました。公式のソースコードのままだと自分の環境では動かなくて、いくつか調整を加えてようやく動かせたというところなので、その手順をまとめておきます。

(Auto-GPTリポジトリは現在盛んに開発が進んでいて、この記事で取り上げた内容はすぐ古くなる可能性が高いです)

筆者の環境

  • Windows11 Home
  • WSL2
  • Docker Desktop v4.18.0

WSL2とDocker Desktopの導入についてはこちらの記事が参考になるかなと思います。

https://qiita.com/KoKeCross/items/a6365af2594a102a817b

(Windows11 ProではWSL2は必須ではないそうです)

ソースコードを取得する

リポジトリはこちら。
https://github.com/Significant-Gravitas/Auto-GPT

PowerShellで以下を実行してソースコードをローカルに持ってきます。
(macOSでも大体同じコマンドで動くかなと思います)

git clone -b stable https://github.com/Significant-Gravitas/Auto-GPT.git
cd Auto-GPT

masterブランチは変更が激しく、Dockerでは動かないような状態でもどんどんマージされるようなので、今回はstableブランチを使います。

この記事を執筆した時点でのstableブランチの最新コミットは 60b2b61 です。
最新のstableでうまく動かない場合は git checkout 60b2b61すると動くかもしれません。

ソースコードの編集

このままDockerイメージをビルドしてコンテナで動かしたいものですが、このまま進むと

  • コンテナ内に正しくファイルがコピーされない
  • AIの代わりにウェブブラウザを動かすところでエラーが起きる

という問題に見舞われたので、Dockerfileと一部Pythonファイルに手を加えます。

Dockerfile

Dockerfile
# Use an official Python base image from the Docker Hub
FROM python:3.11-slim

# Set environment variables
ENV PIP_NO_CACHE_DIR=yes \
    PYTHONUNBUFFERED=1 \
    PYTHONDONTWRITEBYTECODE=1

+ # Install Google Chrome
+ RUN apt-get update && \
+     apt-get install -y --no-install-recommends \
+     wget \
+     gnupg2 \
+ ca-certificates && \
+     wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | apt-key add - && \
+     echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" | tee /etc/apt/sources.list.d/google-chrome.list && \
+     apt-get update && \
+     apt-get install -y --no-install-recommends \
+     google-chrome-stable && \
+     rm -rf /var/lib/apt/lists/*

# Create a non-root user and set permissions
RUN useradd --create-home appuser
WORKDIR /home/appuser
RUN chown appuser:appuser /home/appuser
USER appuser

# Copy the requirements.txt file and install the requirements
COPY --chown=appuser:appuser requirements.txt .
RUN pip install --no-cache-dir --user -r requirements.txt

# Copy the application files
- COPY --chown=appuser:appuser autogpt/ .
+ COPY --chown=appuser:appuser autogpt/ ./autogpt

# Set the entrypoint
ENTRYPOINT ["python", "-m", "autogpt"]

web.py

さらに、 autogpt/web.py のscrape_text_with_selenium関数に以下のように追記します。
こちらもDocker内でChromeを利用するために必要です。

web.py
def scrape_text_with_selenium(url):
    logging.getLogger("selenium").setLevel(logging.CRITICAL)

    options = Options()
+     options.add_argument('--headless') # chromeをheadlessモードで起動する
+     options.add_argument('--no-sandbox') # chrootで隔離された環境(Sandbox)での動作を無効
+     options.add_argument('--disable-dev-shm-usage') # 共有メモリファイルの場所を/dev/shmから/tmpに移動
    options.add_argument(
        "user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.5615.49 Safari/537.36"
    )
    driver = webdriver.Chrome(
        executable_path=ChromeDriverManager().install(), options=options
    )
    driver.get(url)

.envファイルの作成

また、OpenAIのAPIキーなどをコンテナ内の環境変数として設定する必要があるため、設定をまとめた.envファイルを作成します。

cp .env.template .env

プロジェクトルートにあるはずの.env.templateをコピーして、「.env」という名前にリネームしてください。

その後、.envファイルの中身をいじります。いろいろ項目はありますが、

OPENAI_API_KEY=your-openai-api-key

の部分を自分のAPIキーにすれば最低限動きます。

長期記憶としてPinecone(ベクトルDBサービス)を使いたかったり、Azureを使いたかったり、音声の読み上げをさせたかったりしたら追加で設定が必要ですが、詳しくは公式のREADMEを参照してください。

Dockerイメージのビルド

Auto-GPTディレクトリに入ったら、以下でDockerイメージをビルドします。

docker build -t autogpt .

Dockerコンテナの起動

次に、Dockerコンテナを起動してコンテナ内に入ります。

docker run -it --env-file=./.env -v $PWD/auto_gpt_workspace:/home/appuser/auto_gpt_workspace --entrypoint /bin/bash autogpt

公式のREADMEに載っている docker run コマンドに一部変更を加えています。

  • ボリュームのマウント先を修正(多分もとが間違ってる)
  • DockerfileのENTRYPOINTの記述を無視してBashを起動するように上書き(コンテナの外からだとデバッグしにくいので、コンテナの中からAuto-GPTを実行したい)

プロンプト記号が appuser@<コンテナID> に代わり、ls コマンドを打つと、ホームディレクトリにautogptディレクトリとrequirements.txtがコピーされているのが分かります。

また、ホストマシンとファイルを共有するためのauto_gpt_workspaceディレクトリも作成されます。

Auto-GPTを起動

python -m autogpt --gpt3only

筆者はまだGPT-4のAPIを利用できないので、--gpt3onlyのフラグを付けています。GPT-4のAPIをできるし使いたいという人はこのフラグを外してください。
(結構コストがかかると思うので最初のうちはGPT-3で利用することをおすすめします)

以下のように表示されれば起動成功です!

Auto-GPTを使う

最初にAIの名前・役割・ゴールを設定します。
以下、サンプルとして自分が試してみた入力を書いておきます。

AI Name

AI-Expert-GPT

AI専門家GPT

Role

AI who can explain new AI-related technologies, which are developing day by day, in an easy-to-understand way to engineers who are not familiar with AI technologies

日々発展していくAI関連の新しい技術について、AI技術に詳しくないエンジニアに分かりやすく解説してくれるAI

Goal1

Research the open-source LLM called "Vicuna-13B", its overview and performance, and summarize it in a report of about 500 words. (The following commands are not allowed: start_agent, message_agent, list_agents, delete_agent, evaluate_code)

「Vicuna-13B」というオープンソースのLLMについてその概要・性能について調べ、500語程度のレポートに要約しなさい。(次のコマンドは使用禁止です:start_agent, message_agent, list_agents, delete_agent, evaluate_code)

ゴールは最大5つまで設定できますが、少なくていい場合は空欄にすればOKです。
使用禁止にしたコマンドは、少なくともGPT-3.5だと迷走するきっかけになりそうなものです。

これをもとに情報探索を始めた様子はこちらのツイートにまとめました。

https://twitter.com/kecy_ja/status/1647452744410886144

Google検索から始まり、Vicunaの公式ページを見つけて難なく要約を出してくれました。

保存してくれた内容は以下(どれくらい正確かどうかは確認できていません)。

Vicuna-13B_report.txt
Vicuna-13B is an open-source chatbot model that has been trained on user-shared conversations collected from ShareGPT.com using a LLaMA base model. It outperforms other open-source models like Stanford Alpaca and achieves competitive performance against proprietary models. However, it has limitations in tasks involving reasoning or mathematics, accuracy in identifying itself or ensuring factual accuracy, and safety concerns related to potential toxicity or bias. The code and weights, along with an online demo, are publicly available for non-commercial use. The team plans to release the training, serving, and evaluation code on GitHub, as well as the Vicuna-13B model weights, but there is no plan to release the dataset.

Vicuna-13Bは、ShareGPT.comから収集したユーザー共有の会話にLLaMAベースモデルを用いて学習させた、オープンソースのチャットボットモデルです。Stanford Alpacaのような他のオープンソースモデルを凌駕し、プロプライエタリなモデルに対しても競争力のある性能を達成しています。しかし、推論や数学を含むタスクでは限界があり、自分自身を特定したり、事実の正確さを保証する精度や、潜在的な毒性や偏りに関する安全性への懸念があります。コードと重みは、オンラインデモとともに、非商用目的で一般に公開されています。研究チームは、トレーニング、サービング、評価のコードと、Vicuna-13Bモデルの重みをGitHubで公開する予定ですが、データセットを公開する予定はありません。

このレポートをまとめた後、「ちゃんと性能を確かめるには実際にテストしないとな」と言い出してVicuna-13BのモデルをローカルにDLする方法を探し始めたときは驚きました。

公式で見つからなくてもめげずに、HuggingFaceで検索し始めたときは焦りましたが、、なんだかんだでダウンロードする方法を見つけることはかないませんでした。

https://huggingface.co/models?pipeline_tag=text-generation&sort=downloads

GPT-3.5でもそこそこ面白いので、早くGPT-4でやりたい。。

ちなみに、この記事を執筆するために何回かAuto-GPTを動かしましたが、かかったコストは $0.35 。全然安いですが、GPT-4になるとちょっと考えてしまいますね。

Discussion

十五夜十五夜

初めましてこんにちは。面白そうなのでAutoGPTのソースをちょこちょこ読んでるんですが、chat.py の76行目を見る限り、modelはFAST_LLM_MODEL、つまりGPT-3.5-turboに固定されているように見えます。
今のところ、GPT-4を使うにはここのコードを手書きで書き換える必要がありそうです。

あと、VS Code でプロジェクトを開くと Dev Containers でDocker環境下で動くようになるので、そちらを利用するのが楽かもしれません(ただし、自分は使ってない)。

十五夜十五夜

自己訂正です。もう少しちゃんと読んだら、コマンドライン引数処理のところで切り替えてました。
お騒がせしました。
args.py 107行目~

    if args.gpt4only:
        logger.typewriter_log("GPT4 Only Mode: ", Fore.GREEN, "ENABLED")
        CFG.set_fast_llm_model(CFG.smart_llm_model)