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

購入した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達に頼むネタが尽きてきたことか(笑)。先人の方達のアイデアを見ながらこれからゆっくり考えていきたい。