シンギュラリティ実験ノート

購入した1000ドルPCで何がどこまでできるのか実験した記録です。

Local API Server機能とやらを使ってみた

Janの中にLocal API Serverという機能があるのは知っていた。しかしどう使うのか、それを使うと何ができるのか分かっていなかった。YoutubeにあるJanの紹介動画を見ていたら、このLocal API Serverの使い方を説明していた。要するにPythonからWeb APIに従ってLLMに問いかけると、Pythonで回答を受け取ることができる、ということのようだ。

サンプルとして実行していたのは、1日の食事プランをAIに考えてもらう、というPythonスクリプトだった。少し興味が出てきたので自分でもやってみた。

LLMをAPIで使ってみる

API Serverは以下のように、左下のAPI Serverアイコンを選択し、Local API Server画面にしてからStart Serverボタンを押すと起動できる。

動画の中で使っていたPythonスクリプトをそのまま入力して実行してみた結果が以下である。(※Mervin Praisonさん、スクリプト使わせてもらいました。ありがとうございます。)

「Eat egg, banana and cake.」というあっさりとした回答を返してくれた。

2024-03-21 追記 ソースが「Give me meal planfor today.」と変な英語になっていたのが原因のようだ。正しく「Give me meal plan for today.」としたらもっと丁寧な回答を返してくれた。

Web APIを使うと何ができるか

これを発展させると何ができるかということを考えてみた。すぐに思いつくのは、音声で質問を入力して、回答を音声で読み上げるアプリである。もしこれができれば、これまでrinnaとチャットで会話を楽しんでいたが、音声で会話できるようになるわけだ。SF映画her/世界でひとつの彼女」の世界に一歩近づくことになる。

 

音声認識までやろうとすると大変そうなので、テキストで入力して音声出力するまでを試してみることにした。使用したソフトは「VOICEVOX」である。Youtubeでよく「ずんだもん」というキャラクターの声で喋っている動画を見かけるが、おそらくこのソフトを使っているのだろう。このソフトにもWeb APIの機能があり、Pythonから指示することができるのだ。

 

 

ずんだもんに聞いてみた

質問内容を以下のように日本語に変更した。

ずんだもんに喋ってもらうには以下のコードを使う。変数answerに喋る文字列をセットするだけだ。上記のコードでは変数contentに回答が返ってくるので、それをanswerに代入すればいい。

2つのスクリプトをつないで実行したところ、ずんだもんが以下の内容を喋ってくれた。

大規模言語モデル(LLM)は、ニューラルネットワークを使用して自然言語を理解する認知システムであり、生成モデルと呼ばれることもあります。LLMは、多くの自然言語をトレーニングデータとして利用することで学習効果を高め、自然言語の理解能力を向上させます。LLMは、質問に答えたり、文章や画像の生成を行ったりすることができます。

まとめ

ずんだもんには語尾を「〇〇なのだー」と喋らせるのが本来のようだ。私はそもそもずんだもんについて詳しくないので、今回はそこまではできなかった。LLMを使いこなしている人達はLLMの喋り方やキャラクタ設定もしているようだ。奥が深い世界である。

 

Windows+Jan+iGPUで生成AIを動かしてみた

Janでは開発やサポート用のプラットホームとしてDiscordというコミュニケーションサービスを使っている。JanをAMDGPUで動かせないものかと先日Discordを眺めていたら以下の情報を見つけた。

Discord

現在、マルチ GPU サポートは NVIDIA GPU でのみ利用可能であり、CUDA のインストールが必要です。 Vulkan モードで動作する AMD GPU の場合、単一の GPU のみがサポートされます。私たちは、ROCm と HIP を使用して AMD GPU のサポートを構築する方法を模索しています。将来的には、これにより AMD GPU のマルチ GPU サポートが可能になる可能性があります。現時点では、マルチ GPU 機能は、Vulkan モードが無効になっている NVIDIA GPU に制限されています。

Vulkanモードを使えばAMDの単一GPUなら動きそうだということで、今日、私の秘密基地(シェアオフィスのこと)で実験した結果、動かすことに成功したのでここにまとめておきたい。

Vulkanとは

簡単に言うと「次世代のリアルタイム3次元グラフィックAPI」というものらしい。JanではこのAPIを利用してLLMの計算(推論)をAMDGPUで行わせることができるようだ。

Vulkanの導入方法(Windows編)

Vulkan.lunarg.comのページからWindows用のインストールプログラムをダウンロードし、インストールするだけであった。途中でコンポーネントを選択する画面が出る。基本は何も選ばなくて大丈夫のようだが、私は動作確認に必要かと思い全て選択した。

インストール終了後、導入したフォルダのBinフォルダの下にvkviaというプログラムができる。実行すると立方体がクルクル回るデモが動き、正常に導入できたことを確認できる。

JanをVulkanモードにする

  1. Janの画面の左下にあるSettingsのアイコンを押す
  2. Advanced Settingsを選ぶ
  3. Experimental Modeのスイッチをオンにする
  4. Vulkan Supportのスイッチをオンにする

ここまで操作するとGPU AccelerationのChoose device(s)が自動的に「AMD Radeon 780M Graphics」に設定される。

Jan Advanced Settings

VulkanモードでJanを動かす

以上の設定でGPUでJanの上で生成AIを動かすことができる。AI動作中にタスクモニタを確認したところ、GPU Compute 0のところに動作状況が表示された。

GUP動作状況

性能的には14.5 token/Secとなった。CPUで動かしたときには4~9 token/Secであったと思うので2~3倍の性能アップということになる。折角GPUがあるなら使いたいというのが人情である。GPUを使うことで性能をアップさせることができて満足だ。

ただし、手放しで喜べない点もある。ELYZAのような大きいモデルサイズになるとエラーになり起動しなくなるのだ。これはGPU専用メモリが8GBしかないことが原因と思われる。モデルサイズが4GB程度であれば正常に動作しているが、5GBになるともう動かないようだ。

Janの設定をCPUモードに戻す時の注意点

Janの設定をVulkanモードからCPUのモードに戻す時に1点だけ注意が必要だ。画面で設定を戻すだけではCPUでも動かなくなる。GPUでずっと運用しないといけなくなるのかと私も一瞬焦ったが、この問題は設定ファイルを直接編集することで解決できた。

Janを導入したフォルダのsettingsフォルダにsettings.jsonというファイルがある。この中のrun_modeがgpuのままになっているのが原因だ。cpuに直すことで動作するようになった。

{
  "notify": true,
  "run_mode": "cpu",
  "nvidia_driver": {
    "exist": false,
    "version": ""
  },
  "cuda": {
    "exist": false,
    "version": ""
  },
  "gpus": [],
  "gpu_highest_vram": "",
  "gpus_in_use": [
    ""
  ],
  "is_initial": false,
  "vulkan": false
}

まとめ

GPUでJanを動かすことで性能的に2~3倍になることを確認した。ただし動かないモデルも出てくること、性能的にそれほど差があるわけではないことから、CPUで運用したほうがよさそうだ。CPUである程度動くのはUM790 Proのメリットでもある。将来的にBIOSがアップデートされ、VRAMが32GBくらいまで使えるようになることを期待している。

 

AIにチャットで指示してPythonのコーディングをさせてみた

デスクトップで簡単に生成AIを動かせるソフトJanの紹介の続きである。もともとJanを導入したのは、生成AIとチャットでやり取りしながらコーディングなどの成果物が作れないかと思ったことがきっかけだった。一問一答ではなく、それまでの文脈を理解したやり取りをしたかったのだ。今回はコード生成能力の訓練を受けた生成AIの「ELYZA-japanese-CodeLlama-7b」を使い、コーディングおよびそのテストと修正がチャットを介してどれくらいできるかを試してみた。

ELYZA-japanese-CodeLlama-7b

 

準備

以前に紹介したJanへのモデル追加方法に従い、導入済みのELYZA-japanese-Llama-7Bのフォルダをコピーし、model.jsonファイルの内容を修正した。ELYZA-japanese-CodeLlama-7Bのモデルは、Rスクリプトのコーディングを頼んだ時WindowsのWSL2環境でダウンロードしていたので、そのモデルをjan配下のフォルダにコピーした。

これでELYZA-japanese-CodeLlama-7Bをjanで動作させる準備は整った。

作成依頼1 ~100以下の素数

まずは簡単なスクリプトを発注してみた。

100以下の素数を求めるスクリプトの作成

自分で実行してテストできるか聞いてみた。

スクリプトのテスト

会話としては成立している。ただし作成したスクリプトの実行はできないようだ。テストは人間側でやるしかない。しかしOpen Interpreterのように自分で実行ができるようにすると、実行環境に必要なモジュールを勝手にインストールされたりしてそれはそれでこわい。この方が安全でいいのかもしれない。ちなみに上記スクリプトは正常に動作することをJupyterLabで確認できた。

作成依頼2 ~株価の成長率~

続いて例によって株価の成長率を求めるスクリプトを頼んでみた。

株価成長率を求めるスクリプトの作成依頼

ELYZAは数分考えて以下のように回答してきた。

中略

ELYZAの回答

折角なので関数をテストするプログラムを依頼してみた。

ここも文脈を把握して回答をしてくれた。ちゃんと動くかは別として、会話が成立することはすばらしい!

 

次は作成したコードの一部修正を頼んでみた。

文脈は理解してくれている気がするが、修正能力は今ひとつのようだ。上記部分の修正はまあまあだが、他の部分の修正はうまくできなかった。

動作確認

以下はELYZAが作成してくれたスクリプトをベースに私が修正し、JupyterLabでテストした結果だ。ちなみにELYZAが作成してくれたテストプログラムは正しく動かないのでGoogleのAI、Geminiの力を借りてcheck_ticker_existsという関数を追加作成している。

感想

Janを利用することで生成AIとチャット形式でやり取りできることが確認できた。また、テストはチャットの中ではできないことを確認した。ELYZAのコーディング能力もなかなか優秀だと思う。修正をチャットで依頼するのは現段階では難しいというのが私の感想だ。

ELYZAは70Bのモデルを先日発表したようなので、生成AI自体の能力が向上していけば、この状況もまた変わっていくのだろう。

 

UM790 ProをUSB PDで使ってみた

UM790 Proは週末にシェアオフィスで使い、自宅ではMac miniで作業していた。しかし自宅でもUM790 Proを使いたいと思うようになった。UM790 Pro自体は軽いので持ち運べるのだが、ACアダプタは思いので持ち帰りたくない。幸いUM790 ProはUSB-CのPD(給電)に対応しているので、対応したUSB充電器を購入することにした。

充電器の機種選択

購入にあたって参考にしたのは、MINISFORUMのページにもリンクされているYouTubeの動画だった。そこで100WのUSB給電でPCが起動できることを確認し、Amazonで検討して最終的に購入したのはこの充電器だ。

動画では「100Wでも動くが私なら140Wで使う」というYouTuberの言葉があり、それを参考に140Wで給電できる充電器を選んだ。付属品のACアダプタが119.7Wとなっていることがこのアドバイスの根拠だった。

100W対応のUSB-Cケーブルが必要

充電器が届いたので早速家にあるUSB-Cケーブルで動作確認をするが、電源ボタンを押しても電源ランプが点かず全く起動しない。一瞬「返品」ということも考えたが、落ち着いて取扱説明書を読んでみると以下のように書かれていた。

「*140Wの出力を可能にするには、純正のUSB-C to magSafeケーブル或いはPD3.1(28V 5A)に対応するUSB-C to USB-Cケーブルが必要です。」

、VOLTME取扱説明書

私は元々、USB-Cケーブルは一種類しかないと思っていた人だ。UM790 ProのUSB-Cでの映像出力を確認しようとした時も、家にあったUSB-Cケーブルで試しても映像が出力されずに焦った。この時はディスプレイを買った時の付属品にUSB-Cケーブルがあったことを思い出し、そのケーブルで映像が出力されたので、ようやくUSB-Cケーブルには映像出力できるケーブルとそうでないケーブルの2種類があると知ったのだ。

今回更にUSB-Cには140W対応のケーブルや、100W対応のケーブルがあることを知った。

UM790 Proに140Wは不要

その日のうちに家電量販店でケーブルを購入した。100W対応(20V/5A)のケーブルで、しっかり「上限100W」と書かれている。値段は3,480円と高価であったが、これしか置いてないし、早く使いたいので購入した。動作確認したところ、すんなりと起動した。

後日ネットで調べると、140Wに対応したUSB-C to USB-Cケーブルも売られているようだ。

といった経緯で結局100Wで運用することになった。実際のところ100Wで不具合は全く発生していない。試しに、USB-Cにモバイルディスプレイ(約8W)、USBで2.5インチ外付けHDD(約4W)、キーボードと光学マウスをUSBハブ経由で接続し、将棋AIソフトでCPUとGPUをフル回転させてしばらく動かしても全く問題ない。つまりUM790 Pro本体から周辺機器に12Wの給電をしながらでも動いているので、UM790 Proには140W給電は不要、100Wで十分ということだ。

140W給電の使い道

結果的に悔いの残る買い物になってしまった。自己責任であることはわかっているので誰かに文句を言うつもりはない。私の経験が今後の誰かの参考になれば幸いだ。

急速充電に対応した製品を購入すれば140W給電も使い道はあるかもしれないが、今のところ予定はないし、そもそも私は急速充電が好きではない。

急速充電を好きでなくなった原因はマキタの掃除機を購入した経験からだ。マキタの急速充電器についても書きたいことがあるが、書き始めると長くなるのでこれは別の記事にしたい。

 

株価の成長率を求めるPythonスクリプトをAIに頼んでみた

デスクトップで簡単に生成AIを動かせるソフトJanの紹介の続きである。Janで使用できる生成AIの中にPythonのコーディングが得意そうなモデルがあったので試してみることにした。お題としては繰り返しとなって恐縮だが株価の成長率を求めるスクリプトを頼むことにした。

Ubuntu環境への導入

Janはマルチな環境で動く。Mac M1 M2 M3、Mac(Intel)、WindowsLinuxで動く。驚くことにMobileつまりスマホでも動かそうとしているようで、時期は不明だがComming Soonとなっており楽しみである。今回はUbuntu22.04.4LTSに導入してみた。

導入手順はシンプルで以下の3ステップだ。

  1. JanのページにあるLinux(AppImage)のボタンを押す(ダウンロードが開始される)
  2. ダウンロードが終了したら、ダウンロードしたAppImageファイルに実行権を与える
  3. AppImageファイルを起動する

AppImageファイルは解凍不要でこの中にアプリ環境が全て入っていて便利である。ステップ2以降の具体的なコマンドは以下のようになる。「ダウンロード」はダウンロードしたディレクトリ名に読み替えてほしい。起動してもしlibfuse2に関するエラーが出たらlibfuse2をインストールすれば解決するはずだ。

$ cd ダウンロード
$ chmod ugo+x jan-linux-x86_64-0.4.7.AppImage
$ ./jan-linux-x86_64-0.4.7.AppImage
$ sudo apt install libfuse2
$ ./jan-linux-x86_64-0.4.7.AppImage

Janが無事に立ち上がったらモデルをダウンロードする。今回私がダウンロードしたのは「Wizard Coder Python 13B Q5」だ。

実行結果

これまでRスクリプトをAIに依頼した経験などを踏まえて、できるだけ具体的に指示をしてみた。できればAIに一発で動くスクリプトを作成して欲しいからだ。結果的にはプログラム仕様書のような形になった。そういえば若い頃は自分でこんな仕様書を書いたりしてたなーと思い、少し感傷的な気分になる。。

スクリプト仕様書

依頼してから2分くらいは考えていただろうか。回答は英語であったが以下のようにスクリプトを作成してくれた。

Wizard Coderの回答

AIが作成したスクリプトの全体は以下の通りであった。

import yfinance as yf
import pandas as pd
import numpy as np
from sklearn.metrics import r2_score
import datetime
import matplotlib.pyplot as plt
import os

def calculate_stock_data(ticker):
    try:
        stock_data = yf.download(ticker, period='10y', interval='mo')
    except ValueError as e:
        print("Invalid ticker code")
        return
    
    stock_data = stock_data.reset_index()
    stock_data['years'] = (stock_data['Date'].apply(lambda x: (x - pd.to_datetime('2019-01-01')) / np.timedelta64(365, 'D')).dt.days)
    stock_data['log_start'] = np.log(stock_data['Open'])
    
    if len(stock_data) == 0:
        print("No data found for the given ticker")
        return
    
    x = stock_data['years'][:12]
    y = stock_data['log_start'][:12]
    
    coefs = np.polyfit(x, y, 1)
    m, b = coefs[0], coefs[1]
    
    r2_score_value = r2_score(y, [b + m * xi for xi in x])
    yearly_rate = (m - 1) / 0.01
    
    ycalc = [b + m * xi for xi in stock_data['years']]
    plt.plot(stock_data['years'], stock_data['log_start'])
    plt.plot(stock_data['years'], ycalc)
    
    plt.xlabel('Years')
    plt.ylabel('Log Start Price')
    plt.legend(['{} stock price'.format(ticker), 'Theory: $b * m^x$, R2={:.02f}, Yearly rate={:.1%}'.format(r2_score_value, yearly_rate)]);
    
    today = datetime.datetime.today().strftime('%Y%m%d')
    plt.savefig(os.path.join(os.getcwd(), '{}-{}.png'.format(ticker, today))で

出来上がったスクリプトには明らかにおかしい点がある。Rスクリプトを頼んだ時も同じだったが、処理3の経過日数を実数の年に変換する処理、処理4の株価データを対数変換して、取得した係数を逆に指数変換する処理である。指数対数変換は人間も苦手な人が多いと思うが、AIも苦手のようだ。この辺りは大手術であったが私がなんとか直した。なお一点だけAIに謝らなければいけない点があった。この記事を書いている時に気づいたが、年利Rを求める式を私が間違えて指示していた。100で割るのではなく、掛けなければいけない。AI君申し訳ない(ペコリ)。しかしAI君は私のミスに気づいたらしく正しいRの計算式に直してくれていた。その点は褒めてあげないといけないだろう。

私が直して動作確認したスクリプトが以下である。

import yfinance as yf
import pandas as pd
import numpy as np
from sklearn.metrics import r2_score
import math
import datetime
import matplotlib.pyplot as plt

def calculate_stock_data(ticker):
    try:
        stock_data = yf.download(ticker, period='10y', interval='1mo')
    except ValueError as e:
        print("Invalid ticker code")
        return
    
    stock_data = stock_data.reset_index()
    stock_data['days'] = [stock_data['Date'][i] - stock_data['Date'][0] for i in range(0,(len(stock_data)))]
    
    if len(stock_data) == 0:
        print("No data found for the given ticker")
        return
    
    x = stock_data['days'].dt.days / 365.25
    y = stock_data['Open']
    
    logm, logb  = np.polyfit(x, np.log(y), 1)
    m = math.exp(logm)
    b = math.exp(logb)
    r2_score_value = r2_score(y, [b * math.pow(m, i) for i in x])
    yearly_rate = (m - 1) / 0.01
    
    ycalc = [b * math.pow(m, i) for i in x]
    plt.plot(x, stock_data['Open'])
    plt.plot(x, ycalc)
    
    plt.xlabel('Years')
    plt.ylabel('Stock Price')
    plt.legend(['{}'.format(ticker), 'R={:.1f}, R2={:.02f}'.format(yearly_rate, r2_score_value)]);
    
    today = datetime.datetime.today().strftime('%Y%m%d')
    plt.savefig('{}-{}.png'.format(ticker, today))

Jupyter labで動作確認した結果がこちらである。

NVIDIAの株価で動作確認

NVIDIAの資産総額がアマゾンを抜いて3位になったそうなのでテストに使ってみた。成長率が62.1%とすごいことになっている。

まとめ

バグなしで動くスクリプトではなかったが、数分考えただけでスラスラとこれだけのスクリプトを返すのはたいしたものだ。私はPythonのコーディングを一から行うのは正直しんどいが、動かないところをデバッグするくらいならできるので、これだけ作成してくれるとありがたい。またAI君のコーディングで勉強になるところもいくつかあった。プログラム開発の現場ではコーディングできるAIをどんどん活用するべきだろう。逆にそうしなければ生き残れないのではないか。

話は変わるが、AIに書いてもらったスクリプトをブログで記事にする時、「AIが書きました」と明記しないといけないのだろうか。AIが書いたスクリプト著作権は誰にあるのだろうか。よくわからないが、今回作成したスクリプトは自由に使っていただいて結構である。ただしまだバグはあるかもしれないので、自己責任ということでお願いしたい。

 

1000ドルPCで生成AIを動かしてみた(ELYZA編)

1000ドルPC(MINISFORUM UM790 Pro)に生成AIをデスクトップで動かすソフトJanを導入した。今回はJanに用意されていない生成AIを追加導入する方法を紹介したい。

JanはGGUF形式に量子化されたモデルを使用するので、追加できる生成AIは量子化モデルが公開されていることが条件となる。今回追加したのはELYZA-japanese-Llama-2-7Bだ。

ELYZA-japanese-Llama-2-7B

モデルの追加方法

Janを起動し、生成AIのモデルをダウンロードする画面(Hub画面)を表示すると、「
How to manually import model」というリンクがある。

Hub画面

ここをクリックすると下記のサイトが表示され、手順が説明されているので基本的にこの通りに行えばよい。

jan.ai

そうは言っても初めての方は戸惑うであろうし、この手順ではうまくいかない可能性が高いと思う。私が今回掴んだコツというか、着実に行う手順があるのでをここにメモしておきたい。

マニュアルでは以下の手順となっている。

  1. ~/jan/models フォルダーに移動する
  2. <modelname> という名前のフォルダーを作成する (例: tinyllama)
  3. フォルダー内に次の構成を含む model.json ファイルを作成する
    1. id プロパティが作成したフォルダー名と一致していることを確認する
    2. url プロパティが .gguf で終わる直接バイナリ ダウンロード リンクであることを確認する。これで、絶対ファイルパスを使用できるようになる
    3. engineプロパティがnitroに設定されていることを確認する

私がお勧めする方法は以下である。

  1. ~/jan/models フォルダーに移動する
  2. すでにあるフォルダー(例:trinity-v1.2-7b)をコピーして新しいフォルダを作る(例:trinity-v1.2-7b2)
  3. trinity-v1.2-7b2にあるmodel.json ファイル内のidを作成したフォルダ名に合わせる

  4. JanのViewメニューにあるReloadを選択し画面をリロードして作成したフォルダ名のモデルがHub画面に表示されることを確認する
  5. model.json ファイル内の別のパラメタを一箇所修正し、再度画面をリロードしてモデルがHub画面に表示されていることを確認する

上記の4と5を繰り返しながら修正していく方法である。例えばtrinity-v1.2-7b2ではモデルの画像は以下のパラメタとなっている。

"cover": "https://raw.githubusercontent.com/janhq/jan/dev/models/trinity-v1.2-7b/cover.png"

これをELYZAの画像にするには以下のようにURLを変更する。

"cover": "https://huggingface.co/elyza/ELYZA-japanese-Llama-2-7b-fast-instruct/resolve/main/key_visual.png"

画像が正しく表示されたら、次はファイル名を変更するといった具合である。最終的にELYZA-japanese-Llama-2-7B用にmodel.jsonは以下のようになった。

{
  "sources": [
    {
      "filename": "ELYZA-japanese-Llama-2-7b-fast-instruct-q8_0.gguf",
      "url": "https://huggingface.co/mmnga/ELYZA-japanese-Llama-2-7b-fast-instruct-gguf/blob/main/ELYZA-japanese-Llama-2-7b-fast-instruct-q8_0.gguf"
    }
  ],
  "id": "elyza-japanese-llama-2-7b",
  "object": "model",
  "name": "ELYZA japanese Llama 2 7b",
  "version": "1.0",
  "description": "ELYZA is an experimental model merge using the Slerp method. Recommended for daily assistance purposes.",
  "format": "gguf",
  "settings": {
    "ctx_len": 4096,
    "prompt_template": "[INST] {prompt} [/INST]",
    "llama_model_path": "ELYZA-japanese-Llama-2-7b-fast-instruct-q8_0.gguf"
  },
  "parameters": {
    "temperature": 0.7,
    "top_p": 0.95,
    "stream": true,
    "max_tokens": 4096,
    "frequency_penalty": 0,
    "presence_penalty": 0
  },
  "metadata": {
    "author": "Jan",
    "tags": ["7B", "Merged", "Featured"],
    "size": 7274877600,
    "cover": "https://huggingface.co/elyza/ELYZA-japanese-Llama-2-7b-fast-instruct/resolve/main/key_visual.png"
  },
  "engine": "nitro"
}

"prompt_template"という項目はどう直せばよいのか迷うと思うが、これはELYZAのHuggingfaceのページにある使い方(Pythonのサンプルコード)から推測するしかない。

これでうまくいけばDownloadボタンが押せるようになるはずだ。ちなみに私はダウンロードが直ぐに終了し、正しくダウンロードできなかったのだが、以前にダウンロードしたファイルをフォルダにコピーし、無事Useボタンは押せる状態になった。動けばOKなのだ(笑)。

ダウンロードするのはHuggingfaceのmonongaさんのページだ。

huggingface.co

いつも使わせてもらってます。ありがとうございます。

実行結果

好きな鳥山明の作品 by ELYZA

日本語で学習しただけのことはあるようだ。当たり障りのない回答ではあるが、他の生成AIもこれくらいの回答は返して欲しい。

次は専門的テーマについて専門家の意見を参考にするためのプロンプトを試してみた。私が以前からAIの最新情報を学ぶために参考にしているIT naviさんのページにあった方法である。

note.com

ディベートの結果 by ELYZA

全くディベートになっていないぞ! これは期待外れだ。。

最後は例によって100以下の素数を作成するPythonスクリプトを頼んでみた。

Pythonスクリプト by ELYZA

最初の関数 is_prime は正しく動くが、関数 find_prime はエラーになった。最初の関数だけでやめておけばいいのに。find_prime は何をしているのか私には理解できない。

Pythonスクリプトの実行結果

まとめ

使ってみたい生成AIをJanに追加して動かすことができた。上記で紹介したmonongaさんのページではサイバーエージェントが開発した cyberagent-calm2-7b、LINEが開発した line-corp-japanese-large-lm-3.6b-instruction-sft 、最近話題のGoogleが開発した 
gemma-2b-it などの量子化モデルが公開されている。どのモデルも個性がありそうだ。是非試してみたいと思っている。

 

Janを導入するとローカルPCでLLMが快適に使える

LLM(大規模言語モデル)をWindowsのデスクトップから簡単に使えるようにしてくれるソフトがJanである。GPUを使う場合はNVIDIAGPUが前提となっているが、ない場合にはCPUで動かすことができる。

Janを導入することでローカルPCでも快適にLLMが使えるようになるので紹介したい。

導入のきっかけ

Janを知ったのは、Copilotに次の質問をした時に教えてくれたのがきっかけだった。

llama2をチャットで動かす方法を教えて

Llama2をローカル環境で動かす方法を紹介しますね!Llama2はMetaが開発した言語モデルで、興味深い対話を生成することができます。以下は、Llama2をローカルで動かす手順です:

1Janのインストール:
JanはいろんなLLM(Large Language Model)を簡単に動かせるツールです。まず、GitHubからJanをダウンロードします。次に、JanでLlama 2 Chat 70B Q4をダウンロードします。

2Llama 2 Chat 70B Q4のダウンロード:
ダウンロードが完了したら、Janを起動して「Use」ボタンをクリックすれば、Llama2のチャットが開始できます。

3使ってみる:
早速質問をしてみましょう。自分のPCだと大体1トークン/秒くらいの速度で返答してくれるはずです。メモリ使用率に注意してください。

■Janのページ
https://jan.ai/about/

導入方法

ステップ1

Copirotが教えてくれた通り、まず下記のページからWindows版のインストールプログラムをダウンロードする。

jan.ai

プログラムを実行し、Janをインストールする。無事インストールできたらデスクトップにできたショートカット、またはWindowsメニューからJanを起動する。

ステップ2

左メニューにあるHubアイコンを押すとモデルのダウンロード画面になるので、使いたいLLMを選びDownloadボタンを押す。

Hub画面

無事にダウンロードが完了するとUseボタンになるのでこれを押す。

モデルがダウンロードできた状態

もし、ダウンロードが全く始まらない現象が起きたら、アプリを起動し直したり、スレッドを閉じるなどの操作をしてみてほしい。私は何度か経験したが、操作している内に解決できた。まだ原因は不明である。

ステップ3

無事にダウンロードできていれば直ぐにチャットを始めることができる。

以下は「Trinity-v1.2 7B Q4」とチャットした例である。

イギリスで起きた郵便局冤罪事件について

古いデータを元に学習しているためだろう。期待した答えではなかった。最新の情報について聞く時は、GeminiやCopilotの方がよさそうだ。この子については日本語も少しあやしい気がする。

Pythonスクリプトの作成

回答が英語で書かれているが、正しいスクリプトを返してくれた。先日導入したanacondのpython環境でテストした結果が以下である。

Jupyter Notebookでテストした結果

別のモデルでも試してみたが、このレベルのスクリプトなら正しく回答してくれるようだ。

鳥山明の作品

日本のサブカルチャーについてはほとんど学習していないようだ。鳥山明はこんな作品は描いてないだろう。亡くなられた鳥山さんに失礼だぞ!

まとめ

これまではLLMを動かすためには、Hugging Faceからモデルをダウンロードしたり、Pythonのサンプルプログラムを参考に動作環境を自分で用意するなど、導入のハードルは高めであった。Janを使うことでこれらのハードルがかなり下がると思う。

難しい質問をしても返答にかかる時間は10秒程度だろうか。私のPCではCPUでの処理だがストレスはほとんど感じないレベルである。

Janには標準で複数のモデルがダウンロードできるようになっている。また任意のモデルを追加することもできる。ELYZAの日本語学習済みモデルも追加できたので別の記事で紹介したい。