🤖

Dify + Llama 3 で遊んでみる (1)

2024/06/11に公開1

目的

幾らでもこの手の記事はあって何番煎じどころではないが、手元でざっと動かしたので備忘録的にまとめておきたい。

最終的には RAG を使って、今年の新しい論文の概要について答えさせるところをゴールとする。

環境

とある Ubuntu 22.04.4 LTS 環境上で Docker を用いて Dify + Ollama (Llama 3 7B) でやってみる。

環境構築

Docker を使えるようにする

Install Docker Engine on Ubuntu に従ってセットアップ。内容はすぐ陳腐化しそうなので転載はしない。書いてある通りにやるだけ。

Docker で GPU を使えるようにする

Installing the NVIDIA Container Toolkit の通りにやる。これもすぐ陳腐化しそうなので転載はしないが、最終的には以下を実行すると思われる。Docker Hub の ollama/ollama を見ても良い。

$ sudo apt-get install -y nvidia-container-toolkit

もし Docker の daemon が起動していなければ以下のような感じで起動する:

$ sudo service docker start

使うものを整理

  • Dify
    • DifyはオープンソースのLLMアプリ開発プラットフォームです。その直感的なインターフェースは、AIワークフロー、RAGパイプライン、エージェント機能、モデル管理、観測可能な機能などを兼ね備えており、プロトタイプから製品化まで迅速に行うことができます。(by DeepL)
  • Ollama
    • Llama 3、Mistral、Gemma、その他の大規模な言語モデルで稼働させましょう。(by DeepL)
    • というのはピンと来ないが、ググった感じでは色んなモデルをローカル LLM として動かせる OSS

Ollama セットアップ

Docker でやるので、

$ docker pull ollama/ollama:latest

する。ところで何故か llama3 のダウンロード時に Pulling manifest fails with error "read: connection reset by peer" と同様のエラーが起こったので、モデルのダウンロード用に

$ docker pull ollama/ollama:0.1.27

した。とりあえずモデルをダウンロードしたいので公式の手順と同様に以下を実行する。コンテナを stop した時に残骸が消えて欲しいので --rm を追加している。

$ docker run -d --rm --gpus=all -v ollama:/root/.ollama -p 11434:11434 \
             --name ollama ollama/ollama:0.1.27

Llama 3 7B のダウンロードは以下のようにする:

$ docker exec -it ollama ollama run llama3
...
pulling manifest
pulling 6a0746a1ec1a...  58% ▕████████████████████████████████████                           ▏ 2.7 GB/4.7 GB   11 MB/s   2m50s

ダウンロードが終わるとプロンプトが起動するので、

>>> What's your name?
I don't have a personal name. I'm an AI, so my purpose is to assist and communicate with users like you without a
personal identity. I exist solely to provide helpful information, answer questions, and engage in productive
conversations. You can think of me as "Assistant" or simply "AI" – no need for a specific name!

>>> /bye

などと遊んであげる。

なお、コンテナ起動時にボリュームのマッピングとして ollama:/root/.ollama としていたので、

$ docker system df -v
...
VOLUME NAME                                                        LINKS     SIZE
...
ollama                                                             1         4.661GB
...

というのように「ollama」というボリュームに Llama 3 7B がダウンロードされる。要らなくなったらボリュームを破棄したほうが良さそうだ。

これが完了すれば、次回以降の ollama の起動は「ollama/ollama:0.1.27」ではなく「ollama/ollama:latest」で良さそうだった。

Ollama のセットアップは以上である。

Dify セットアップ

$ git clone https://github.com/langgenius/dify.git
$ cd dify/docker

から始める。今回、docker-compose.yaml を少し書き換える。Nginx をポート 8080 で起動しつつ、Docker コンテナの中からホストの 11434 番ポートで動いている Ollama が見えるようにしたい。ホスト側のネットワークを見えるようにする魔法を「extra_hosts」でセットする。

version: '3'
services:
  # API service
  api:
    ...
    extra_hosts:
      - "host.docker.internal:host-gateway"

  nginx:
    ports:
      - "8080:80"

より具体的には以下である:

$ git diff
diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml
index c3b54305..e784a132 100644
--- a/docker/docker-compose.yaml
+++ b/docker/docker-compose.yaml
@@ -191,6 +191,8 @@ services:
     networks:
       - ssrf_proxy_network
       - default
+    extra_hosts:
+      - "host.docker.internal:host-gateway"

   # worker service
   # The Celery worker for processing the queue.
@@ -486,7 +488,7 @@ services:
       - api
       - web
     ports:
-      - "80:80"
+      - "8080:80"
       #- "443:443"
 networks:
   # create a network between sandbox, api and ssrf_proxy, and can not access outside.

ここまでできたら Dify の起動は簡単で、以下である:

$ docker compose up -d

終了する時は以下である。

$ docker compose down

Dify の UI から設定

localhost:8080 でアクセスする。ローカル LLM なので適当なユーザーとパスワードを設定する形でアカウントを作る。終わったらメイン画面に遷移する。

ユーザーアイコンをクリックすると「設定」があるので、そこから LLM の設定をする。

色々見えているが Ollama があるので、以下のような感じで設定する。

Model Name: llama3
Base URL: http://host.docker.internal:11434
Completion mode: Chat
Model context size: 4096
Upper bound for max tokens: 500
Vision support: No

再びメニューに戻って、中央上部の「スタジオ」から「チャットボット」を選んで「最初から作成」などを選択する。

右下の入力欄のようなところに何か入力すると ChatGPT のようにお話ができる。但し英語で返答してくることが多いようなので「日本語で」といった指定を入れると便利であった。

RAG

これだけだと面白くないので RAG をする。NRI の解説 RAG によると、

RAGとは
Retrieval-Augmented Generation (RAG) は、大規模言語モデル(LLM)によるテキスト生成に、外部情報の検索を組み合わせることで、回答精度を向上させる技術のこと。

ということである。素の Llama 3 の場合、以下のような感じで知らないことはかなり適当な回答になる。

ここで問うている CompactifAI とは CompactifAI: Extreme Compression of Large Language Models using Quantum-Inspired Tensor Networks という LLM をテンソルネットワーク技術でモデル圧縮する今年の論文である。流石にこんな知識を持っているとは思えない。

Dify のメニューの中央上部に「スタジオ」の右に「ナレッジ」があるので、ここでナレッジを拡張できる。「知識を作成」をクリックすると以下のようなフローティングウィンドウが出るが何と pdf がそのままいけるということで D&D してアップロードする

終わったらチャットボットの画面に戻って、左下の「コンテキスト」で「+ 追加」でアップロードした pdf のナレッジを登録する。

この状況で 先ほどとまったく同じ 質問をすると段違いの反応が得られる。

まとめ

Dify + Ollama で Llama 3 を動かして、RAG のナレッジを追加して今年の論文について簡単な概要を答えさせることができた。かなり作業スペースを食うというか、どんどんストレージを圧迫するので、余裕を見て 100GB くらいの空き容量 は欲しいところである。Docker を使わないならもう少しコンパクトにできるかもしれないが、ホスト環境が汚れそうなので個人的には嫌である。

GitHubで編集を提案

Discussion

derwindderwind

補足

ストレージの消費量は例えば以下のように推移する:

  • 最初
/dev/root      ext4     101430960 43454532  57960044  43% /
  • sudo apt-get install -y nvidia-container-toolkit
/dev/root      ext4     101430960 43464356  57950220  43% /
  • docker pull ollama/ollama:latest
/dev/root      ext4     101430960 44000576  57414000  44% /
  • docker exec -it ollama ollama run llama3
/dev/root      ext4     101430960 48552748  52861828  48% /
  • (dify) docker compose up -d
/dev/root      ext4     101430960 53676352  47738224  53% /

また、docker のイメージが沢山 pull される:

$ docker images
REPOSITORY                  TAG         IMAGE ID       CREATED         SIZE
nginx                       latest      e0c9858e10ed   4 days ago      188MB
ollama/ollama               latest      ad86d8d10907   4 days ago      538MB
langgenius/dify-web         0.6.11      882c7d6ccdb8   10 days ago     231MB
langgenius/dify-api         0.6.11      51cffa4be33e   10 days ago     2.62GB
ubuntu/squid                latest      34b6bbbcf74b   2 weeks ago     146MB
postgres                    15-alpine   00b2bb697bff   3 weeks ago     243MB
langgenius/dify-sandbox     0.2.1       e5baf511eea9   3 weeks ago     409MB
redis                       6-alpine    d21be8aaaa15   4 weeks ago     30.1MB
semitechnologies/weaviate   1.19.0      8ec9f084ab23   13 months ago   52.5MB