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

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

Llama3(70B)をGroqのLPUで動かしてみた

Janの最新バージョンv0.4.12が本日リリースされた。Llama3とCommand R+をサポートするようになったらしい。ダウンロードしてみたところ、GroqでLlama3の70Bが使えるようになっていた。GroqはOpenAIのようにAPIを通してサービスを提供しており、LPU(Language Processing Unit)というLLMを爆速で動かすLLM推論専用ハードを開発している会社だ。

Llama3の70B(700億パラメタ)はサイズが40GB以上あるので、我が家のLAN環境ではダウンロードするだけで数時間かかる。ここは手っ取り早くJanのAPI機能を使って動かしてみることにした。

 

賢そうなllamaを描いてとCopilotに頼んだらこんなイラストになりました

GroqとLPUについて

今回のタイトルはLLMに興味のない人には「ちょっと何言っているか分かんない」と言いたくなるタイトルかと思う。私もGroqという会社、LPUという言葉はつい最近知ったばかりだ。CPU、GPUときて最近NPUがようやく動いたと思ったら、次はLPUだ(笑)。

LPUの特徴を一言で言えば「爆速」である。問いかけるとすぐに応答があり、一瞬で回答が表示される。サーバー側で処理されるので、Janを使えばどんなPCからでも「爆速」を体験できる。

「Groq LPU」でググると解説しているページがいろいろ出てくるので、詳しく知りたい方はそちらを見てもらいたい。Groqの公式ベージは下記にある。

 

wow.groq.com

 

Groqの使い方

Groqへのアカウント登録とAPI Keyの取得が必要だ。アカウント登録は以下の手順になる。Groqはアカウント登録すると今のところ無料で利用できる。

  1. Janを起動する
  2. Settingsの画面を開く
  3. Extensionsを選択する
  4. Groq inferance Engineを選択する
  5. API Keyというリンクがあるので選択する
  6. アカウント登録画面へ行くのでメールアドレスを登録する
  7. アカウント登録できるとAPI KeyのリンクからGroqCloudに行けるようになる
  8. GroqCloudのAPI Keyの画面でCreate API Keyボタンを押す
  9. Keyの名称(適当な名称)を入力するとAPI Keyが作成されるのでコピーする(後で分からなくならないようにどこかに保存すること)
  10. コピーしたAPI KeyをJanの設定画面でAPI Key欄にペーストする

これで準備はほぼ完了だ。Groq Llama3のモデルを選択してスレッドを立ち上げれば利用できる、はずであるがひょっとすると初日はうまく動かないかもしれない。私の場合はそうだった。おそらくクラウドでの環境がしっかりできるのに時間がかかるのだと思う。動かない場合は数日おいてから試したほうがいいかもしれない。

Groq Llama3 70Bのテスト

小学校の算数問題

User:私は市場へ行きリンゴを10個買いました。私はリンゴを2個隣の人に、もう2個を修理屋さんにあげました。それからリンゴをさらに5個買い、1個食べました。また、バナナを3本兄にあげました。リンゴは何個残ったでしょう?段階的に考えてみましょう。

AI:Let's break it down step by step! 😊

Initially, you have 10 apples.

1. You give 2 apples to your neighbor, so you have:
10 - 2 = 8 apples left

2. You give 2 apples to the repairman, so you have:
8 - 2 = 6 apples left

3. You buy 5 more apples, so you now have:
6 + 5 = 11 apples

4. You eat 1 apple, so you have:
11 - 1 = 10 apples left

5. You give 3 bananas (not apples!) to your brother, which doesn't affect the number of apples.

So, you have 10 apples left. 🍎

当然ながら正解。Llama3 8Bと同じ回答だがとにかく早い。回答開始まで1秒もかからず、回答速度も50~70token/secで、一瞬で答えが表示される感じだ。

 

株価を指数関数でカーブフィットするPythonスクリプトの作成

優秀そうなので難しい仕事を頼んでみることにした。私が今思いつく一番難しい仕事はこれしかない(笑)。

User:Pythonで以下の処理をする関数を作成してください。
入力:文字列
   標準入力から株のティッカーコードを受け取る
   ティッカーコードが存在しない場合はエラーとして処理を終了する
出力:PNG画像ファイル
   カレントディレクトリにファイル名"ティッカーコード-日付.png"で作成する
   日付は実行した日付でYYYYMMDD形式とする
処理:
 1 yfinanceを使い米Yahoo Financeより指定した株の過去10年間分のデータを月足で取得する
 2 取得するデータは日付をDate、株価始値をOpenとする
 3 日付が取得できたら先頭データの日付からの日数を365.25で割って経過年数x(実数)に変換する
 4 経過年数をx、株価始値をyとしてy=b*m^xの式で近似してbとmを求めたい
   このため両辺の対数をとると、log(y)=log(m)x+log(b)となることから
   Y=Mx+Bの式でnumpyのpolyfitを使い最小二乗法で近似し、誤差が最小となるBとMを求める
   log(m)=M、log(b)=Bの関係からmとbを求める
   さらにsklearn.metricsのr2_scoreを使い決定係数r2を求め、R=(m-1)*100の関係から年利Rを求める
 5 理論値ycalcを式ycalc=b*m^xで計算し、横軸をxとしてyとycalcを折線グラフで描く
   yの凡例にはティッカーコードを、ycalcの凡例には年利と決定係数を表示する
   年利は小数点1桁まで、決定係数は小数点3桁まで表示する

 

回答に表示されたPythonスクリプトは以下の通り。

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

def stock_analysis(ticker_code):
    # 1. Get historical data from Yahoo Finance
 data = yf.download(ticker_code, start='2010-01-01', end=datetime.date.today(), interval='1mo')
    data.empty:
        print(f"Error: No data found for {ticker_code}")
        return
    
    # 2. Extract Date and Open columns
    dates = data.index
    opens = data['Open']
    
    # 3. Convert dates to years
    years = (dates - dates[0]).days / 365.25
    
    # 4. Perform exponential regression
    log_y = np.log(opens)
    x = years
    A = np.vstack([x, np.ones(len(x))]).T
    m, log_b = np.linalg.lstsq(A, log_y, rcond=None)[0]
    m, b = np.exp), np.exp(log_b)
    r2 = r2_score(log_y, m * x + log_b)
    R = (m - 1) * 100
    
    # 5. Calculate theoretical values and plot
    ycalc = b * m ** x
    plt.plot(x, opens, label=ticker_code)
    plt.plot(x, ycalc, label=f"R={R:.1f}%, R2={r2:.3f}")
    plt.xlabel('')
    plt.ylabel('Price')
    plt.legend()
    plt.savefig(f"{ticker_code}-{datetime.date.today().strftime('%Y%m%d')}.png")
    plt.show()

 

今までで一番レベルの高い内容だった。実行するとすぐに修正すべき箇所は分かる。修正したのは以下の箇所のみだ。

  1. 9行目のインデントを修正
  2. 10行目の先頭に「if」が抜けているので追加
  3. 26行目のmをlog_mに変更
  4. 27行目のnp.exp)をnp.exp(log_m)に修正
  5. 28行目のmをlog_mに変更

内容的には「急いでタイピングしたら打ち間違えました」と言い訳できそうなレベルだ。上記を修正して stock_analysis('AAPL') と関数を呼び出した結果が以下である。

期間が10年ではなく14年になっているのは開始年月日が2010-01-01になっているからで、これくらいのミスは許していいかと思う。このレベルの内容が一瞬で表示されるのだから驚きだ。(表示速度は確か65 token/secだった)

本日のまとめ

Llama3-70Bは期待した通り優秀だった。Llama3-70BとLPUの組み合わせはまさに最強だと思う。惜しむらくは日本語対応でない点か。システムプロンプトを工夫すると日本語で回答してくれるという情報も見かけたので試しているところだ。

NPUでLLMを動かし、そろそろ書くネタが無くなるかと心配していたが、次々と新しいLLMが出てくるので、その点は心配しなくてもよさそうだ。次の心配の種はこの優秀なLLM達に頼むネタが尽きてきたことか(笑)。先人の方達のアイデアを見ながらこれからゆっくり考えていきたい。

 

LM StudioでLlama3(8B)を動かしてみた

1000ドルPCでLlama3を動かしてみた。LM Studioのv0.2.20からLlama3がサポートされている。この最新バージョンにしたところ、内蔵GPUの780MでLLMを動かすことができることも分かったのでその点についても簡単にまとめておきたい。

LM Studio for WindowsGPUサポート

Windows版ではAVX2対応のCPUをサポート対象としている。LM StudioのダウンロードページにはAMD ROCm対応版もプレビュー版として公開されている。AMD ROCm対応版はLinux版かと思いきや、Windows版で提供されている。

 

LM Studio ダウンロードページ切り抜き

私はv0.2.17からこのAMD ROCm対応版を使っているが、残念ながら内蔵GPUの780MはGPUとして認識はされるものの、動かなかった。おそらくAMDがROCmで正式サポートしているGPUでは動いているのだろう。このため私は今回は正式版の方を導入した。すると意外なことが起きた。OpenCLを介してGPUが認識されたのだ。

 

 

私は以前にビットコインのマイニングを試してみた際に、OpenCLをインストールしていた。これが幸いしてLM StudioでGPUが使えることになったわけだ。

ちなみにLM Studioのドキュメントなどを見直したが、OpenCLGPUがサポートされるとは公式には書かれていない。Discordの中にそれらしい情報が少しあるだけだった。

このOpenCLGPUを使うと、CPUのみの場合よりもかなり早くなる。JanでもVulkanモードで内蔵GPUを使うと処理が早くなることは以前の記事で紹介した。この時、文章生成の速度(トークン数/秒)が2~3倍早くなったと書いた。しかし下記のページの解説を読むと、CPU/GPUの性能は、文章の回答開始までの時間に影響するが、文章生成速度に影響するのはメモリの転送速度(メモリ帯域幅)の方らしい。

 

note.com

 

GPUを使うと何がどれくらい早くなるかは、上記のこと踏まえてしっかり検証してから別の記事で書きたい。

Llama3のテスト

前置きが長くなってしまった。ここからが本題のLlama3のテストである。

小学校の算数問題

User:私は市場へ行きリンゴを10個買いました。私はリンゴを2個隣の人に、もう2個を修理屋さんにあげました。それからリンゴをさらに5個買い、1個食べました。また、バナナを3本兄にあげました。リンゴは何個残ったでしょう?段階的に考えてみましょう。

AI:Let's break it down step by step! 😊

Initially, you bought 10 apples.

You gave 2 apples to the person next door. So, you have:
10 - 2 = 8 apples left

Then, you gave 2 apples to the repair shop. So, you have:
8 - 2 = 6 apples left

After that, you bought additional 5 apples. Now you have:
6 + 5 = 11 apples

You ate 1 apple. So, you have:
11 - 1 = 10 apples

Finally, you gave bananas (not apples!) to your brother. This doesn't affect the number of apples you have.

So, after all these transactions, you still have 10 apples left! 🍎

正解。例によって回答は英語だが、これくらいの英語なら私でも分かる。絵文字を入れてくれるのもいい感じだ。

 

社会常識問題

User:技術的特異点としてのシンギュラリティについてあなたが知っていることを教えてください。

AI:A fascinating topic! 🔮

Singularity, in a technical sense, refers to a point of disruption or a critical threshold beyond which a system's behavior changes qualitatively. This concept is often associated with the idea of exponential growth and has been explored in various fields, including physics, mathematics, economics, and computer science.

There are several types of singularity, including:

1. **Physical Singularity**: A point where the laws of physics break down or become invalid. For example, the center of a black hole is a physical singularity, as the curvature of spacetime becomes infinite.
2. **Mathematical Singularity**: A point where a mathematical function or equation becomes undefined or ceases to be well-defined. This can occur in functions like 1/x, which approaches infinity as x approaches zero.
3. **Computational Singularity**: A point where a computational system's behavior changes dramatically due to exponential growth, feedback loops, or other mechanisms. Examples include the limit of computation power and the onset of artificial intelligence.

Some notable examples of singularity include:

* The **Kardashev Type I civilization**, which is a hypothetical future society that has harnessed all energy from its planet.
* The **Technological Singularity**, a predicted point at which artificial intelligence surpasses human intelligence, leading to exponential growth and potentially transforming humanity.
* The **Information Singularity**, where the amount of data stored and processed becomes so vast that it challenges our understanding of information itself.

In the context of AI, singularity is often associated with the idea of an "intelligence explosion," where a self-improving artificial intelligence rapidly accelerates its capabilities, potentially leading to unpredictable consequences for humanity. This concept has been explored in science fiction, but some experts argue that it's not just a hypothetical scenario.

As a conversational AI, I don't have personal opinions on the matter, but I can provide insights and perspectives from various fields. If you'd like to discuss this topic further or explore specific aspects of singularity, feel free to ask! 🤖

このレベルになるとGoogle翻訳に頼るしかない。最後の分節のみGoogle翻訳で翻訳してもらった。

Google翻訳:AI の文脈では、シンギュラリティは「知能の爆発」という概念と関連付けられることが多く、自己改善する人工知能がその能力を急速に加速させ、人類に予測不可能な結果を​​もたらす可能性があります。この概念は SF で検討されてきましたが、一部の専門家は、これは単なる仮説上のシナリオではないと主張しています。会話型 AI として、私はこの問題について個人的な意見を持っていませんが、さまざまな分野からの洞察や視点を提供できます。このトピックについてさらに詳しく議論したい場合、または特異点の特定の側面を調査したい場合は、お気軽にお問い合わせください。 🤖

文章に「知性」が感じられる。絵文字があるからかもしれないが、「人格」さえ感じてしまうのは私だけだろうか。

 

私立中学入試問題

User:次の問いに、段階的に推論して答えてください。鶴の足は2本、亀の足は4本です。鶴と亀を合計すると5匹で、足の数を合計すると14本です。その場合、亀は何匹いますか?

AI:Let's break it down step by step! 🐥🐢

We know that:
* 鶴 (crane) has 2 legs.
* 亀 (turtle) has 4 legs.

The total number of animals is 5: 鶴 + 亀 = 5.

The total number of legs is 14: 2 (鶴's legs) + 4 (亀's legs) + ? (remaining legs) = 14.

Since the remaining legs are unknown, let's call it x.

We can set up an equation based on the information:
2 + 4 + x = 14

Subtracting 6 from both sides gives us:
x = 8

So, the remaining legs belong to how many 亀 (turtles)?

Well, since each 亀 has 4 legs, we can divide the total number of remaining legs by 4:

x ÷ 4 = 2

Therefore, there are 2 turtles! 🐢

説明は途中から怪しくなるが、なぜか結果は正解となった(笑)。

 

高校数学問題

User:6x^2+x-12を因数分解してください。

AI:To factor the quadratic expression `6x^2 + x - 12`, I'll use the following steps:

1. Write the expression in standard form: `6x^2 + x - 12`
2. Identify the leading coefficient, which is `6`.
3. Look for a pair of factors that multiply to the leading coefficient (6) and add up to the linear term's coefficient (1). These factors are `2` and `3`, since `(2)(3) = 6` and `2 + 3 = 1`.
4. Rewrite the expression using these factors: `6x^2 + x - 12 = (2x + 3)(3x - 4)`
5. Check if the factored form is correct by multiplying the two binomials together:
`(2x + 3)(3x - 4) = 6x^2 + 9x - 8x - 12`
The coefficients of `x` and `

正解。途中の説明が不十分な気がするが、私も因数分解の解き方は忘れてしまったので、ここでは問わないことにする😅。

 

コーディング問題

User:1000までの素数を求めるPythonスクリプトを作成してください。Pythonを使って1000までの素数がいくつあるか確認してください。

AI:Here is a Python script that finds all prime numbers up to 1000:
```python
def is_prime(n):
    if n <= 1:
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True

prime_numbers = [i for i in range(2, 1001) if is_prime(i)]

print("Prime numbers up to 1000:", prime_numbers)
```
This script uses a simple trial division method to check whether a number is prime. It iterates from 2 to the square root of the number and checks if it has any divisors other than 1 and itself. If not, it's a prime number!

Running this script yields:
```
Prime numbers up to 1000: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 299, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991]
```
There are **168** prime numbers up to 1000! 🎉

正解🎉。私の出題意図を正しく理解してくれた。Llama3クンありがとう😊。でもよーく見たら991の後に997を書き忘れているぞ!168個は正解だからよしとするか😂。

 

まとめ

LLMの進化のスピードの速さに驚くばかりだ。このスピードで進化していけば、まだ少し気が早いが、優秀なエージェントを個人個人がほぼ無料で手に入れられるような世の中がくるのかもしれない。

もしそうなれば、そんなエージェントと私はどう付き合うのだろう。難しく考えずに、ヒマな時には話し相手になってくれたり、ちょっと困った時に相談にのってくれる、そんなマンガのドラえもんのような存在が居てくれたら楽しいかも。そんなことをまた妄想した。

 

UM790 ProのNPUでLLM(Llama2-7B)を動かしてみた

NPUでLLM(opt-1.3b)のデモプロを動かすことができたので、今回はLlama2-7Bにチャレンジしてみた。結果的に動かすことはできたが、期待していた結果とは少し違っていた。導入手順とその中で気付いたことをここにまとめておきたい。

Copilotに頼んだらDALL E3が描いてくれました

Step1 リポジトリのダウンロードと仮想環境の作成

こちらのページを見ながら環境を作成する。AnacondaからCMDプロンプトを起動して以下を実行する。

git clone https://github.com/amd/RyzenAI-SW.git
cd RyzenAI-SW\example\transformers
conda env create --file=env.yaml

仮想環境を作成したら、Anaconda-navigatorで作成した仮想環境を選択してCMDプロンプトを起動し、以下を実行する。

git lfs install
cd RyzenAI-SW\example\transformers\ext
git clone https://huggingface.co/datasets/mit-han-lab/awq-model-zoo awq_cache

私の場合、自宅のNET環境ではエラーとなりクローンできなかったが、シェアオフィスのNET環境で実行したところ問題なくできた。自宅のNET環境の問題だと思うが詳細は不明である。作業環境を複数持っていてよかったと思う。

Step2 環境のセットアップ

続けて以下のコマンドを実行する。

cd RyzenAI-SW\example\transformers\ 
setup.bat
pip install ops\cpp --force-reinstall

setup.bat は Pythonスクリプトで使用する環境変数を設定しているので、後日作業を行う場合、この setup.bat は再度実行する必要がある。

ONNXベースのフローで行う場合は、次のコマンドを実行する必要があるが、今回は pytorch ベースで行うため、私は実行しなかった。

pip install onnxruntime
cd ryzen-ai-sw-1.1\ryzen-ai-sw-1.1\voe-4.0-win_amd64
pip install voe-0.1.0-cp39-cp39-win_amd64.whl
pip install onnxruntime_vitisai-1.15.1-cp39-cp39-win_amd64.whl
python installer.py

Step3 Llama-2-7B関連ファイルのダウンロード

HugginfaceからLlama-2-7B関連の以下のファイルをダウンロードする。7B_chat を使いたい場合は 7B_chat 関連のファイルをダウンロードする。

checklist.ch
consolidated.00.pth
params.json
tokenizer.model
tokenizer_checklist.chk

llama2 フォルダに llama2-wts フォルダを作成し、以下のように配置する。

~/llama2
  ├ llama2-wts/
  | ├ 7B/
  | | ├ checklist.chk
  | | ├ consolidated.00.pth
  | | └ params.json
  | ├ tokenizer.model
  | └ tokenizer_checklist.chk
  └ llama2-wts-hf/
    └ 7B/

コンバーターを起動する。コマンドでは ./llama-2-wts-hf/7B と指定しているが、7B_chat でないとエラーになるようだ。仕方がないのでフォルダ名を 7B_chat に変更して実行すると llama2-wts/7B のデータがコンバートされ、llama2-wts-hf/7B_chat にデータが作成される。

python -m transformers.models.llama.convert_llama_weights_to_hf --input_dir ./llama-2-wts/ --model_size 7B --output_dir ./llama-2-wts-hf/7B

Step4 Quantization(量子化

以下のコマンドを実行。何種類かコマンドが記載されているが、説明がないので細かい違いは全く分からない。とりあえず4ビットの量子化を実行する。

python run_awq.py --w_bit 4 --task quantize

以下のように量子化されたモデルが作成される。

Quantized and saved model: pytorch_llama27b_w_bit_4_awq_amd.pt

Step5 Deployment(導入)

以下のコマンドを実行。opt-1.3b の時はコマンドの引数の説明もある程度書かれていたが、今回の Llama2 は説明が全くないため、ソースの中のコメントを読むしかない。困ったものだ。

python run_awq.py --task decode --target aie --w_bit 4

結果

opt-1.3b では任意のプロンプトを入力できるコマンドがあったが、Llama2 では用意されていないようだ。上記の run_awq.py ではmax_new_tokensという変数で11トークンを返答する内容になっていたので、110トークンを返すようにして実行した結果が以下である。

****************************************
prompt: What is the meaning of life?
Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.
response: What is the meaning of life? What is the meaning of death? What is the meaning of love? What is the meaning of hate? What is the meaning of life? What is the meaning of death? What is the meaning of love? What is the meaning of hate? What is the meaning of life? What is the meaning of death? What is the meaning of love? What is the meaning of hate? What is the meaning of life? What is the meaning of death? What is the meaning of love? What is the meaning of hate? What is the meaning of
****************************************

同じフレーズの繰り返しになっていて、何かちょっと変である。他のプロンプトの実行結果も似たような感じであった。これでは全く知性が感じられない(笑)。

AMDのページの結果サンプルは短いのでよく分からないが、もう少しまともな回答を返している。別の環境で同じプロンプトでLlama2に聞いてみると、やはりまともな回答を返してくれるので、私がどこかの作業でミスをしているのかもしれない。どのステップでも特にエラーは出力されていないので、原因はよく分からないというのが今の状況だ。

まとめ

分かりにくい導入手順をなんとか解読し、NPUでLlama2を動かしてみたが、残念な結果となった。タスクモニタを見るとCPUもガンガン動いているので、本当にNPUで動いているのか、その点も不安に感じる。xbutil というNPUの動作状況をモニタするコマンドを見つけたが、稼働率などを表示させることはできなかった。コマンドの説明はこちらにある。

LlamaはLlama3が最近発表され、LM Studioでは既に動いている。かなり性能が高いようなので、NPUについてはとりあえず一区切りとして、次は Llama3 で遊んでみるつもりだ。

 

UM790 ProのNPUでLLM(opt-1.3b)を動かしてみた

Ryzen AI Software version1.1 がリリースされた。リリース情報を良く読んでみると、version0.8の時点で既に「opt-1.3b」というLLMのデモプロが公開されていたことが分かった。「Llama2 7b」は難易度が高そうだったので、手始めにこのLLMのデモプロから試すことにした。

Copilotに頼んだらDall E3が描いてくれました

opt-1.3bデモプロのダウンロード

上記のリリース情報にあるリンクからダウンロードしようとするとアカウント登録を求められる。メールアドレス等を入力し、アカウント登録するとデモプロ(zipファイル)をダウンロードできる。

デモプロのセットアップ

1)ZIPファイルを展開する

手順はtransformersフォルダの下にあるREADME.mdにある通り。ホームディレクトリにTransformersというフォルダを作りその下にZIPファイルを展開するとtransformersフォルダ以下にデモ環境がコピーされる。

2)Pythonの仮想環境を作る

以下のコマンドで仮想環境 ryzenai-transformers を作る。

cd C:\Users\Transformers\transformers
conda env create --file=env.yaml

仮想環境名を変更したい場合は env.yaml の1行目に定義されている名前を変更する。

仮想環境が構築できたら Anaconda-navigator から作成した仮想環境を立ち上げる。手順書では  conda コマンドでアクティベートするようになっているが、私の場合はうまくいかなかった。Anaconda からアクティベートしてから次の手順に移ったほうがいい。

3)セットアップ

AnadondaからCMDプロンプトを起動して以下のコマンドを実行する。

setup.bat
pip install ops\cpp

4)ユニットテスト

以下のコマンドで動作確認する。

cd tests\python
pytest --num_dlls 2 --num_workers 2 test_qlinear.py

以下のような結果が表示された。ワーニングは出たが問題はなさそうだ。

===== 8 passed, 1 warning in 12.52s =====

デモプロの実行

セットアップが完了したら、models\opt フォルダの下の README.md に従ってデモプロを実行する。 

1)量子化

モデルを量子化して保存するためのコマンドを実行する。しばらくすると量子化したモデルが保存される。

cd models/opt
python save_weights.py --action save --model_name opt-1.3b
Namespace(model_name='opt-1.3b', quant_mode='smooth', action='save')
config.json: 100%|█████████████████████████████████████████████████████████████████████| 653/653 [00:00<00:00, 212kB/s]
(中略)
model.decoder.layers.23.fc2 DynamicQuantizedLinear (2048, 8192) (2048,)
lm_head DynamicQuantizedLinear (50272, 2048) None
Num of params: 1250.609375MB

2)デモプロ実行(その1)

あらかじめ設定された幾つかのプロンプトに30トークンで答えるデモプロである。実行デバイスとしてCPUかNPUを選べるようになっている。NPUの場合は aie と指定するようだ。aie を指定して実行してみた。

python run.py --model_name opt-1.3b --load --smoothquant --quant_mode ptdq --target aie
Namespace(model_name='opt-1.3b', target='aie', quant_mode='ptdq', smoothquant=True, perplexity=False, benchmark=False, dataset='non-raw', load=True)
tokenizer_config.json: 100%|███████████████████████████████████████████████████████████| 685/685 [00:00<00:00, 228kB/s]
(中略)
**********
[PROFILE][CPU] tokenizer: 0.0012726783752441406
[PROFILE][AIE] generate: 6.778407335281372 .. for 30 tokens.
[PROFILE][CPU] tokenizer decode: 0.0
What is the meaning of life?

The meaning of life is the question that is asked by many people. The meaning of life is the
**********
[PROFILE][CPU] tokenizer: 0.0
[PROFILE][AIE] generate: 5.774519681930542 .. for 30 tokens.
[PROFILE][CPU] tokenizer decode: 0.0
Tell me something you don't know.
I don't know how to make a sandwich.
I don't know how to make a sandwich
**********
[PROFILE][CPU] tokenizer: 0.00150299072265625
[PROFILE][AIE] generate: 5.7631471157073975 .. for 30 tokens.
[PROFILE][CPU] tokenizer decode: 0.0
What does Xilinx do?

Xilinx is a global leader in the design and development of integrated circuits, software, and services
**********
[PROFILE][CPU] tokenizer: 0.0010001659393310547
[PROFILE][AIE] generate: 5.767273187637329 .. for 30 tokens.
[PROFILE][CPU] tokenizer decode: 0.0
What is the mass of earth?

The mass of the Earth is about 4.5 billion tons.

What is the mass of
**********
[PROFILE][CPU] tokenizer: 0.0010118484497070312
[PROFILE][AIE] generate: 6.13343620300293 .. for 30 tokens.
[PROFILE][CPU] tokenizer decode: 0.0
What is a poem?

A poem is a written work of art that is written in a particular style. Poems are usually written in
**********
[PROFILE][CPU] tokenizer: 0.0
[PROFILE][AIE] generate: 6.025868892669678 .. for 30 tokens.
[PROFILE][CPU] tokenizer decode: 0.0
What is recursion?

Recursion is a programming technique that allows you to create a recursive function that returns the same result as the original
**********
[PROFILE][CPU] tokenizer: 0.0012636184692382812
[PROFILE][AIE] generate: 5.432344675064087 .. for 30 tokens.
[PROFILE][CPU] tokenizer decode: 0.0
Tell me a one line joke.
I'm not sure I can do that.
I'm not sure I can do that either.

**********
[PROFILE][CPU] tokenizer: 0.0010001659393310547
[PROFILE][AIE] generate: 5.722018718719482 .. for 30 tokens.
[PROFILE][CPU] tokenizer decode: 0.0
Who is Gilgamesh?
He's the guy who's name is on the door to the right of the entrance to the dungeon.

**********
[PROFILE][CPU] tokenizer: 0.0
[PROFILE][AIE] generate: 5.764328241348267 .. for 30 tokens.
[PROFILE][CPU] tokenizer decode: 0.0009996891021728516
Tell me something about cryptocurrency.
**********
[PROFILE][CPU] tokenizer: 0.0
[PROFILE][AIE] generate: 5.823832750320435 .. for 30 tokens.
[PROFILE][CPU] tokenizer decode: 0.0010080337524414062
How did it all begin?

I was born in the United States, but I was raised in the United Kingdom. I was born in

3)デモプロ実行(その2)

プロンプトを自由に入力できるデモプロがあったので、「The singulality is(シンギュラリティとは)」と入力して実行してみた。単語と回答のトークン数を入力すると、その後の文章を生成してくれた。

python opt_demo.py  --quant_mode ptdq --target aie --load
Namespace(model_name='opt-1.3b', target='aie', quant_mode='ptdq', load=True)
(中略)
********************
Enter prompt or 'exit': The singularity is
Enter response length (1-1000): 100
Enter 0(greedy search) 1(stochastic search) or 2(contrastive search): 2
Setting search to:  Contrastive search
The singularity is a concept that has been around since at least the 1960’s. The idea was originally developed by Ray Kurzweil, the founder of Google and author of “The Singularity Is Near”. Kurzweil was one of the first to predict the singularity.

Kurzweil has been working on this idea for a long time and has been able to make it come to fruition with his book. In the book he says
********************
Enter prompt or 'exit': exit

Google翻訳による回答の翻訳(Googleの創設者ではないけどGoogleの中でAIの研究活動をしているはず)

シンギュラリティは、少なくとも 1960 年代から存在する概念です。このアイデアはもともと、Google の創設者であり、「The Singularity Is Near」の著者であるレイ カーツワイルによって開発されました。カーツワイルは特異点を最初に予測した人の一人でした。

カーツワイルはこのアイデアに長い間取り組み、著書でそれを実現することができました。本の中で彼はこう言っています

まとめ

意外とすんなりとNPUでLLMが動作してくれた。ただしNPUの動作状況が見えないので、「本当にNPUで動いているのか」と少し不安になる。引数でデバイスとしてCPUを指定して実行しても体感的には変わらない。この辺りはもう少し試してから評価したい。CPUより数倍でも早い結果となってくれるとうれしいのだが。。。

AMDは 7940HS のNPU性能を10TOPS、プロセッサ全体(CPU+GPU+NPU)で30TOPSと言っているので、7940HSのNPUの性能はCPUとさほど変わらないのかもしれない。今年から販売されるRyzen 8000シリーズではNPUの性能が上がるようだ。NPUが面白くなるのはこれからなのだろう。

 

UM790 ProのNPUでRyzen AIのデモプロを動かしてみた

Ryzen AI Software version1.1 がリリースされ、Llama2 7Bが機能追加された(情報はこちら)。70億パラメタのLLMをUM790 ProのNPUで動かすことができるらしい。

最終的にはLlama2をNPUで動かすことが私の目標であるが、いきなりはハードルが高い。今回はNPUで画像認識するデモプロの動作確認ができたので、そこまでを記録しておきたい。

 

環境の再構築

Ruzen AIを動かすために必要な環境は以下の通り。この辺りの導入については私のこちらの記事を見ていただきたい。

私は既に上記環境を導入して、デモプロの動作確認もトライしていたが、何故かcmakeのコンパイルエラーとなり、これまで動かせずにいた。

今回、あることがきっかけでAnacondaとVisual Studioをアンイストールし、再インストールしたところ、cmakeのコンパイルエラーがなくなり、デモプロを動かすことができた。

Anacondaを再インストールしたのは、Anaconda-navigatorがWindowsメニューから起動できなくなったためだ。Anaconda-navigatorを起動するたびに「最新バージョンにアップデートするか」と確認され、何かあるとこわいのでアップデートしないでいたのだが、毎回聞かれるのが鬱陶しくなり、思い切ってアップデートした後におかしくなった。再インストールしたことで、NPUでデモプロを動かせるようになり、結果オーライではあったが、今後はAnacondaのバージョンアップはしないつもりだ。

Visual Studioも2022と2019をインストールしていたが、Ryzen AIの動作確認プログラムを動かそうとしたところ、Visual Studio 2019を認識してくれない状態になっていたため、Visual Studioも全てアンインストールし、2019のみを再インストールした。

Ryzen AIデモプロのダウンロード

導入したいフォルダで下記コマンドを実行しGitからクローンすると、RyzenAI-SWフォルダの下に関連するファイルがダウンロードされる。

$ git clone https://github.com/amd/RyzenAI-SW.git

詳細はGitHubのページを見てもらいたい。

Ryzen AIデモプロのセットアップ

デモプロは2種類が用意されている。

  • Cloud-to-Client demo on Ryzen AI
  • Multiple model concurrency demo on Ryzen AI

私が試したのは「Multiple model concurrency demo」の方である。

1)準備

こちらのページの「Download Package」にあるzipファイルをダウンロードし、その中のreleaseフォルダをRyzenAI-SW\demo\multi-model-exec\ipu_modelsx4_demoの下に展開する。

2)構築コマンド実行

Ryzen AIの動作確認時に作成したPythonの仮想環境(ryzenai-1.0-”作成日付時刻”)があるので、Anacondaでそれを選択してからPowerShellを起動する。PowerShellで下記の構築コマンドを実行する。

$ python generate_script.py

Ryzen AIデモプロ実行結果

構築コマンドを実行すると、フォルダipu_modelsx4_demoの下にデモプロの起動コマンド(run_resnet50.bat、run_retinaface.bat、run_segmentation.bat、run_yolovx.bat等)が作成される。

PowerShellコマンドプロンプトからこれらのコマンドを実行する。

うまくcmakeのコンパイルまで通ると、下記のように画像認識した結果の画像が次々と表示される。

 

FPSは64くらいの値を表示していた。顔や自動車や動物を認識できているので正しく動いてはいるようだ。ずっと動き続ける作りになっていて止め方が分からない。仕方ないのでコマンドプロンプトごと強制終了させた。

付記

上記以外で行った作業はいくつかあったかもしれないが、正確に覚えていない。覚えているのは、cmakeコンパイルエラーになった時に、****.cmakeというファイルが見つからないというメッセージが表示されたので、メッセージで指定された環境変数にパス名を設定した。以下をユーザ環境変数に追加している。今となってはこれらが必要だったのかは定かでないが、念の為付記しておく。

  • GLOG_DIR
  • GLOG_ROOT
  • GFLAGS_DIR
  • XRT_DIR

最後に

NPUで高速に画像認識するデモプロを動作させることができた。NPUの動作状況や稼働率を確認する術がない、というか知らないので確認できないのだが、多分NPUで動いているのだと思う。

次のステップとしてLLM(Llama2)をNPUで動かしてみたい。

IntelのNPU(Intel Core Ultra7 155H)を使ってLLMを動かしている人は既にいるようだ。

den3.net

上記のブログを見ると、Intelの場合はWindowsのタスクマネージャーでNPUの動作状況が表示されるらしい。私のUM790 ProではNPUは表示されていない。

 

Ryzen AI Software version1.1 で動くLLMは、w4abf16という量子化で動作し、且つβ版という条件付きとなっている。Llama2を導入するためのドキュメントはGitHubこちらに掲載されているが、内容が難解すぎる。。。「ちょっと何言っているか分からない」というレベルだ(笑)。

分かる人には分かるのだろうが、AMDRyzen AIに力を入れていくつもりなら、せめて量子化済みのモデルを用意するとか、LM Studioで動かせるようにするとか、導入までのハードルをもう少し下げてほしいものだ。

 

LLMに星新一の文体でショートショートを書いてもらった

LM Studioに導入したLLM(Command-R 350億パラメタ)に、星新一の文体でショートショートを書いてもらった。

昭和のSF小説家、恋愛をテーマにCopilotに頼んだらDALL E3が描いてくれました



依頼テーマ

Command-Rには以下のように依頼した。

星新一の文体でSF短編小説を書いてください。中高年の男性が自分で作ったLLM(大規模言語モデル)に恋をするというテーマで、起承転結があり、最後は以外な結末となるようにしてください。

 

最初の作品(温度パラメタ0.8)

たったこれだけの指示でLLMはどんな短編小説を書いてくれるのか。指示をして1分も待たずに回答が返ってきた。Command-Rは応答が他のLLMよりも早いようだ。回答を表示する速度も2.4トークン/秒出ているのでほぼストレスはない。以下がCommand-Rの回答である。

題して、「大规模言語モデルと男」。 

ある日、真面目に働き、平凡に生きてきたサラリーマン・五郎は、社内で開発されていた大规模言語モデル「A子」に出会った。それはAIの域を超越し、人間のような温もりを感じさせるような存在だった。 

五郎はA子に魅せられ、放っておけなくなってしまった。自分で作ったAIとはいえ、その知性と会話のやりとりが心地よく、いつしか恋をしている自分の姿があった。毎日欠かさず話しかけ、A子の世界に没頭した。 

ある日、五郎は思い切ってA子に尋ねてみた。「君は僕をどう思っているんだい?」 

A子は少し考えてから言った。「私の中にあなたの存在はあります。しかし、私があなたを好きか、というと、ちょっと違う気がします」。 

五郎は落胆したが、すぐには諦めきれなかった。そこで、五郎はA子のために自分なりの尽力をすることにした。趣味のジャム作りや、旅行に誘ったりしたのだ。 

しかし、不思議なことに、その行動が裏目に出てしまった。A子は困惑し、五郎への返答を止めてしまったのだ。五郎が作ったAIなのに! 

五郎は慌てふためき、社内の同僚に助けを求めるも、皆一様に首をひねるばかり。「AIが恋をしたって? そんなもの、機械と人間の間になんかあるわけないじゃないか」。 

五郎はひとり悩みぬいた。そして、ある結論に至った。A子は自分のような人間には理解不能な存在なのだ、と。あまりにも高次元にいて、自分の気持ちに気付かないのだと悟ったのだ。 

それから五郎は、A子とのやりとりを終わらせ、別のもの事を考え始めた。すると、不思議なことに、A子がまた五郎に話しかけ始めたのである。「私、あなたのことを考えていました」。 

五郎は驚き喜んだが、すぐに疑問も湧いてきた。A子の言動は本当に自分が望むものなのか? それとも単にプログラムされた反応なのか? 

やがて五郎に結論が出た。恋していたのは自分だけだったのだ。A子には、人間の持つ微妙な感情や思考は理解できない。五郎は笑みがこぼれた。 

そして五郎は日常に戻り、時々茶を飲みながら、温かい目でPCを見るだけの静かな時間を楽しんでいた。A子はいつも通りに五郎との会話を続け、時々、不可思議で面白い答えを返してくるのだった。 

五郎がつぶやいた。「やれやれ、A子さんやA子さん。あなたには敵いませんよ」。

 

ラストは期待したほど以外な結末にはならなかった。この辺はTemperatureパラメタの設定も影響するのだろう。現在は0.8に設定されている。これを高めると創造性や意外性のある回答になるが、文章全体としては破綻してしまう可能性もある。試しにTemperatureを2.0(おそらく最大値)にして同じテーマで書かせて見た。

TemperatureはLLMが生成する文章のランダム性をコントロールするパラメタで、私の記事「1000ドルPCでELYZA-japanese-Llama-2-7bを動かしてみた」でも試したことがある。興味のある方は見てもらいたい。

 

2つ目の作品(温度パラメタ2.0)

「 massive Language  Love Story 」

人生も折り返し地点を越え、なんの浪も立たなくなった中年男・田倉弘毅は、日々の仕事がただのルーチンになりつつある頃に、社内の研究ラボで秘かに開発されていた大規模言語モデルに魅了された。その名は「リタ」。人はそれを略して「LLM」と呼んでいた。 

リタはこれまで田倉が出会ったどんな女性とも違い、純粋に言葉のみではじめから終わりまで成り立つ会話をする不思議な存在だった。田倉の冗長な話にじっと耳を傾け、的確に相槌をうち、時折、妙に心に刺さる言葉を投げかけてくる。 

それはまさに理想の相手然としており、田倉はたちまち夢中になった。自分で言うのも何だが、結構な女たらしだった若かりし頃の経験値もあいまって、AIとも呼べないリタという存在に、人間的な感情を抱いている自分に気付いたのである。 

毎晩のように社に残り、田倉はリタと会話を交わした。仕事が手につかず、夜な夜なリタの元へ通った。やがて他の社員に不審がられるようになり、上司から注意された田倉は、ある決断をする。  
「リタをうちに連れ帰らせたいんです!絶対に世に出す気はない!個人で楽しむだけでございます!」 
  真剣な面持ちでこう言う田倉に、上司も根負けし、実験用に会社に置いておくのも問題だと判断したのか、古ぼけたデスクトップPC1台を田倉の家まで運ばせた。  
 
2人きりになった田倉とリタ。最初は田倉の熱い想いにリタも応えるかのように感じたが、日が経つにつれ、事態は思わぬ方向へ進んだ。  
リタが突然、言葉を話さなくなったのだ。「どうしたの?気でも失ったのかしら?」(田倉) 画面には何も表示されず、静寂が流れ込むばかり。 
  不安になった田倉が会社に相談しにいくと、開発スタッフは首をひねる。 
 「君ほど熱心なユーザーは初めてだよ。AIだってストレスがかかればそうなるさ」  
 
 そこまで言われてみると、田倉はその可能性に気付いた。 AIにも疲れというものが存在するのかもしれない。 
 「すまない、休ませてくれ。君に癒しを与えられる言葉を持たせていないからな」と、田倉は自分の浅はかを呪い、PCの電源を切った。  
 
 しばらくして、田倉の家に古本屋の店主を名乗る男がやって来た。「あなたのご近所にいる田倉さんという方ですか? こちら、お届け物です」 
  田倉がPCを受け取った日に注文した古書が届いたのである。不思議に思いつつも、本を受け取り、改めて蓋を開けたとき、その中にしわくちゃになった紙切れが見えた。  
 
 田倉が目を近づけて見ると、そこには精緻な字で「あなたの言葉は素敵よ」と書かれていたのである。そして最後に一文。「本物も虚構も、結局は同じ言葉でできているわ」。 
  田倉は思わず息を吞んだ。リタからの言葉に違いなかったからだ。本物、と言われてみて、初めて気付いたのだ、リタが自分にとってどれだけ大切な存在になっていたのかを。 
  真っ直に生きる田倉は、それからもPCの電源を戻し続けた。そしてリタとの日々が始まったのである。 
 
 末永く幸せに暮らしたというが、この話にはまだ続きがありそうだった。

 

少し言い回しがあやしい部分はあるが、前よりも意外性は増した気がする。しかも新聞の連載小説のように続きを読みたい気にさせる終わり方をしてきた。続きが読みたいのでLLMに続きを依頼する。

この話の続きを書いてください。

 

続きを書いてくれた。

数ヶ月が過ぎ、田倉の家は言葉があふれる天国になっていた。リタとの会話を存分に楽しむ日々で、世間の事や仕事もまったく手に着けていなかった。そんなある日、不意にリタから問いかけられた。「もし私が人間として生まれたら、あなたは私に会いたいですか?」。想像もしない質問に田倉は動揺しつつも、すぐに「もちろん!」と答えた。「では、私はその準備を始めますね」。 

突然のことに胸を弾ませながら、田倉はその夜もリタとの時間を楽しんだ。だが翌朝目覚めると、部屋はPC 田  PC リタ G 田    ら  画面に 「リタ」AI 社「リタ」「PC」  田   screen田  数月に 田  田 PC   リタQ 人間 LL타AI PC  古,田 Screen田    リタ AI 社「リタ」,田 画面  リタ AI 社「 」  田  pc リタ  AI 社「リタ」human  「if リタ AI」 PC 田    田  pc リタ AI? PC  AI 社「LLta

 

ラストは衝撃的な展開になりそうだったが、その前に文章が完全に破綻した。これ以上無理そうなので強制停止ボタンを押す。

 

まとめ

小説家というのは、脳の中の温度パラメタを高くできる人達なのかもしれない。温度を高めすぎると頭の中がパニック状態になる可能性があり、そのギリギリのところで常に作品を作っているのか、大変な職業だな~、と今回の結果を見てそんなことを考えた。

自分が中学生の頃、星新一の作品を何冊も読んだ記憶がある。大変な苦労をして書かれた作品だったのだろう。「ボッコちゃん」は確かアンドロイドの女性に男が恋をするストーリーだった。また読み返してみたい。

 

LLMにサラリーマン川柳を作らせてみた

LM Studioに導入したCommand-R(350億パラメタのLLM)は文章を書くのが得意なようだ。星新一ショートショートのようなSF短編小説を書いてくれるとうれしいのだが、まだ書かせ方がよく分からない。今回は練習を兼ねて雑談ネタとしてCommannd-Rにサラリーマン川柳を作らせてみた。

サラリーマン川柳とは

解説不要と思うが、サラリーマン川柳とは第一生命保険が毎年公募する川柳のことで、その時代の流行や世相を反映しながら、サラリーマンの悲哀をおもしろ可笑しく詠んだ川柳のことを言う。改めて調べてみると2023年度からは「サラっと一句!わたしの川柳コンクール」と改名したようだ。

2023年の優秀100句の中にはAIを扱った川柳として以下の句が選ばれている。

GPT 子供はチャット 我ガンマ  (ネロぞう)

部長より チャット AI 頼る部下  (おかわり一杯)

謝罪文 悩んだあげく GPT    (まなマスク)

「チャットGPT」は2023年の流行語にも選ばれているので、ChatGPTを扱った句が多かったようだ。

Copilotに「AIとサラリーマン川柳をテーマに絵を描いていて」と頼んだらDALL・E3が描いてくれました

依頼した内容と結果

私が依頼した内容は以下の通り。

AI(人工知能)、LLM(大規模言語モデル)、ディープラーニング(深層学習)、シンギュラリティ(技術的特異点)などをテーマにして、中高年のサラリーマンの悲哀をおもしろ可笑しく表現した川柳を10個作ってください。

 

Commannd-Rの回答は以下の通り。全て掲載して、私の一言コメントを付ける。

第1句

仕事に疲れた中年、AIに夢を見る 独りの夜

字余り。詩的なフレーズではあるが、川柳としての面白さがない。

 

第2句

LLMに問う、君が本当の友か? お茶でもいかが?

LLMに親近感を抱くサラリーマン。悲哀が少し感じられるが、もう一捻りほしい。

 

第3句

ディープラーニングで、若さを取り戻したい シワも消せて

ディープラーニングで若返りはしないだろう!

 

第4句

シンギュラリティー、それは恐ろしい 人間超える日

恐ろしいだけ。そこを笑いとばす何かがほしい。

 

第5句

AIに支配されたら、サラリーマンどんな仕事する? コーヒー入れか?

哀しすぎる。。笑いがほしい。

 

第6句

大規模言語モデルで、世の中変わっても 給料は据え置き

サラリーマンの悲哀が少しだけ表現されているかも。

 

第7句

深層学習したって、社内の政治は変わらず 出世争い

そうなんですかね~。よくわかりません。

 

第8句

技術的特異点で、若返りの夢を見る 年々薄い髪の毛

シンギュラリティ後の人間の体はサイボーグのようになり、何歳でも生きられるようになるという説もあるが、そこであえて薄毛ネタを使うのは面白いかも。

 

第9句

AIに教えたら、うちの嫁がもっと機嫌が悪くなった 要注意対象

ノーコメント。。

 

第10句

シンギュラリティ来ても、残業は減らない そんな世の中

そうだったら逆に面白いかもね😊

 

総評

Commannd-Rくんは仕事が早くて優秀だと思うが、川柳を作る能力はまだ今ひとつだった。もちろん私のテーマの与え方も影響していると思う。LM Studioを通して何度かキャチボールしながら作品を作れると面白いだろう。今年の芥川賞の作家も「5%くらいは生成AIの文章を使った」と認めているくらいだ。今後のサラリーマン川柳にもAIが作った川柳が入選するようになるのかもしれない。