SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|

2024-08-19(Mon) ハスに構えつつAIを動かしてみる

  先日「仕事で既存の生成AIに問い合わせる仕組みを作っている」と書いたが、そのすぐ横で後輩が「手元で生成AI動きました」なんて報告を上げてきた。え、マジッ!?

  聞くとちゃんとコンテナで上げていて、普通にコンソールから日本語で質問を与えられる状態になっていて驚愕。なにかがうまくいってなくて「こんにちは」の応答に数分かかるようだが、とりあえず動くということだけでスゴい。自分的に、同僚からこういう刺激を与えられるのって、すごく嬉しい。滅多になかったことだ。

  ollamaという流行りの仕組みを使っているらしい。調べると、それほどの手数を要さずに動くようだ。それほどの超弩級スペックも必要ないっぽい。こういう、同僚からの嬉しい刺激に報いる一番の方法は、すぐに追いついて一緒になって取り組むことだ。

  というわけで、やってみた。自分はすぐにdocker-compose.ymlにまとめてしまうのが好きなので、以下のようにまとめてしまう。

services:
    ollama:
        image:
            docker.io/ollama/ollama
        container_name:
            ollama-alpha
        ports:
            - "11434:11434"
        volumes:
            - pv:/root/.ollama
volumes:
    pv:
        driver: local
# データを永続的に保持する領域として
# mkdir -pv pv しておくこと
        driver_opts:
            type: none
            o: bind
            device: $PWD/pv

  ollamaコンテナを上げたら、日本語の言語モデルの導入が必要になる。どの言語モデルを導入するのが適当かわからないので、ググって出てきたサイトのお勧めをそのまま試す。また、Modelfileという定義を書いて初期設定をする必要があるのだが、それもよくわからないので同サイトのお勧めをそのまま試す。

/root/docker/ollama # cd pv
/root/docker/ollama/pv # mkdir llm-jp-13b-instruct
/root/docker/ollama/pv # cd llm-jp-13b-instruct
/root/docker/ollama/pv/llm-jp-13b-instruct # wget llm-jp-13b-instruct-full-ac_001_16x-dolly-ichikara_004_001_single-oasst-oasst2-v2.0-Q4_K_M.gguf
/root/docker/ollama/pv/llm-jp-13b-instruct # vi Modelfile
/root/docker/ollama/pv/llm-jp-13b-instruct # cat Modelfile 
FROM ./llm-jp-13b-instruct-full-ac_001_16x-dolly-ichikara_004_001_single-oasst-oasst2-v2.0-Q4_K_M.gguf
 
PARAMETER temperature 0.7
PARAMETER top_p 0.95
PARAMETER repeat_penalty 1.05
PARAMETER stop "<EOD|LLM-jp>"
 
TEMPLATE """{{ if .System }}{{ .System }}{{ end }}{{ if .Prompt }}
 
### 指示:
{{ .Prompt }}{{ end }}
 
### 応答:
{{ .Response }}<EOD|LLM-jp>"""
SYSTEM """以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。"""
 
/root/docker/ollama/pv/llm-jp-13b-instruct # cd ../..
/root/docker/ollama # docker_exec
# INTO [ollama-alpha].
root@aef3abf257e5:/# cd root/.ollama/llm-jp-13b-instruct
root@aef3abf257e5:~/.ollama/llm-jp-13b-instruct# ollama create llm-jp-13b-instruct -f Modelfile
root@aef3abf257e5:~/.ollama/llm-jp-13b-instruct# ollama list
NAME                       	ID          	SIZE  	MODIFIED     
llm-jp-13b-instruct:latest 	bb43f78e1cbd	8.3 GB	7 seconds ago	
root@aef3abf257e5:~/.ollama/llm-jp-13b-instruct# exit

  コンテナの中で「ollama create」することで「llm-jp-13b-instruct」という名前で言語モデルを登録している。それが終われば、以下でコンテナの外から日本語で質問を与えられる。

/root/docker/ollama # docker exec -it ollama-alpha ollama run llm-jp-13b-instruct
>>> こんちは。
こんにちは。
 
>>> Send a message (/? for help)

  「こんちは。」だけなら10秒くらいで応答が返ってきた。速くはないが、N100のローエンドPCで、だからね。

/root/docker/ollama # docker stats
ID            NAME                  CPU %       MEM USAGE / LIMIT  MEM %       NET IO             BLOCK IO           PIDS        CPU TIME      AVG CPU %
aef3abf257e5  ollama-alpha          390.81%     14.72GB / 16.53GB  89.06%      6.952kB / 978B     8.959GB / 2.052GB  30          7m59.065034s  114.62%

  とはいえ、コンテナの動作状況を見るとパッツンパッツンだ。言語モデルの大きさの7.8Gに対し、メモリは15G弱が専有される。ただし、動作による増減はないっぽい。

  ちょうど1年半前くらいにChatGPTで遊んでみていたが、手元で動くのはもっと先だと思っていたわ。まぁ、アーケード版に対するファミコン版かもしれんけど、それでも手元で動くのは夢がある。

  例によって遊んでみよう。

/root/docker/ollama # docker exec -it ollama-alpha ollama run llm-jp-13b-instruct
>>> 1980年台の傑作アーケードゲームを5つ挙げてください。
1980年代のアーケード・ビデオゲームの傑作には以下のようなものがある:
 
ギャラガ
スペースインベーダー
ドンキーコング
パックマン
フロッガー
 
>>> ドンキーコングとはどんなゲームですか?
ドンキー・コング』は、1982年にナムコが開発・発売したアーケード・コン
ピュータ・ゲーム。プレイヤーはアーケード版『キングコング』(1980年)を
基にしたゲームで、アーケード版ドンキーコングのスピンオフ作品。
 
プレイヤーはアーケード版キングコングのキャラクターであるドンキーコング
を操作し、アーケード版キングコングの敵役であるアーケード版キングコング
のキャラクターであるコングを避けながら、バナナを集め、できるだけ長く生
き残ることを目指す。
 
>>> Send a message (/? for help)

  まぁ、例によって派手にハルシネっているが、それはそれで面白い。

  実はちょっと前に、社内のAIサービスのAPIを対象にRubyのライブラリを書いていたのだが、どうもAIのAPIというのは、既にデファクトスタンダードがあるようだ。手元にAIがあるなら、転用できるか試してみようかしらん。