こんにちわ! AI ポッドキャスト、シーズン43は2023年7月29日に開催した ZOOMライブの模様です。
この日のテーマは「夏休みもAIだ!」です。
エピソード4は、パート2「最近の LLMs」その2、「Andrej Karpathy の llama2.c」です。
このブラウザでは再生できません。
再生できない場合、ダウンロードは🎵こちら
ビデオ見れる人はこちらからご覧ください。
(以下は、OpenAI の Whisper を使って文字起こししたものを修正したものです。)
** 注:以下は未編集の草稿です **
はい、みなさん「こんばんわ!」です。
「こんにちわ! AI FORUM」です。
今日の日付は 2023 年 7 月 29 日、7月の回になってます。
ということで、めでたしめでたしだけども
そうこうしてたら
Andrej Karpathyがまたなんか面白いことを
Twitterで投稿してて
なんだろうと思って見に行ったって話ね
最近のTwitterアラタムXから
しつこいね
Lama2.cっていうプロジェクトを
Weekend Hack、Weekend Projectとして
ちょっとやってみたんだーって言って
かわいいアイコンをね
これあれかな
彼OpenAI使い放題だろうから
あれか、Darlyで書かしたのかね
あれね、今時あれJIT、GitHubの
レポジトリのトップに
こういうキャッチーな写真は
入れないといけないんですね、きっとね
このプロジェクト面白そうだと
で、これ自体は
後で振り返りますが
この人、この人は
gg_gel_garnoff
は何者かっていうと
言わずと知れた
lama.cppの人ですけども
ね、すかさず
lama.cppに
lama2.cモデルの
労働サポートを入れたよっていう
わけわかんない状況になってるんだけど
その辺ちょっと後で振り返りますが
すごく欲しいのはね、なんか
世の中、世界中がこのプロジェクトに
熱狂してるみたいで
週刊トップGitHubの
プロジェクトレポジトリになったみたい
みたいな話で、みんな注目してる
このプロジェクト、これは何なんだっていう話ですけども
これは何なんだって話ですけども
ここにジャンプすればいいやな
こういう風にね、ピョッて
アイコン入れなきゃいけないね
これは
lama2っていうモデルの実装なんですけども
学習と推論
トレーニングとインフルエンスができる
lama2の
プログラム集みたいなんだけども
トレーニングはPyTorchで実装されている
ミニマルだね
このプロジェクトでトレーニングされた
モデルを
推論するプログラムはCで書く
純粋に
推論のプログラムはlan.cっていうプログラムで
依存性がほとんどない
500行ぐらいのC
ファイルで書かれたプログラムに過ぎない
それで推論できる
だから
ファインチューニングみたいな学習も
普通今まで通りPyTorchでやります
推論は
そうやってできたモデルはCで
推論できるよう
将来的には
彼の狙いは
ハンディなフレームワークで
スペシフィックなドメイン性の
モデルを
ファインチューニングして
可能性を模索したいみたいなこと
言わずと知れた
アンドレは
NanoGPTっていう
エデュケーショナルなプロジェクトがありましたし
僕もそれ研究してるね
自分でやったんで
そうそう
ラマ2モデルを
自分で学習しようっていう
プロジェクトPyTorch
それだけじゃなくて
学習されたモデルを推論するプログラムが
Cだけで書かれてる
だからプロジェクトの名前が
ラマ2.Cになってるよ
NanoGPTっていう
GPTっていうモデルを
全部理解
トランスフォーマーを理解するために
スクラッチから全部実装
Pythonでして
学習もしちゃえって言ってやった
プロジェクトがありました
それベースでラマ2も実装して
書いてあったねきっとね
だから面白いと思って
今年の2月に
今年の2月に
AIコーラムで
実際に
ここが
実際に
ここが
実際に
ソースコードを
クローンしたんじゃなくて
自分で全部打ち込んだと
今の時に
そうやって染み込んだっていう話ね
トランスフォーマーを完璧に理解したわけです
ここで
今年の2月にねやっと
OK
OK
そのノリのラマ2なんだなと
プラスアルファなんだなということで
しっかり遊びたいなっていうことの一つで
今回時間なかったのできなかったんですが
夏休みの課題
論文読むっていうのは課題その1ですけども
実装レベルのやってみたいなと思うこと
あったりするんですけども
ラマ2と
GPTトランスフォーマー
論文のちらっと最初の方だけ読んだんだけど
最新の知見を
やっぱり反映されてるので
細かなところは変わってるところがあるよみたいに書いてあって
バッジノルムを
後ろに入れるのを前にするとか
そういうやつとか当たり前のところから
アクティベーションが違う関数になっちゃって
今さらっと読んでこのラマアンドレの
ラマの2のコードは
アクティベーションどうなってたかな
なので僕自身も
できるはずなんだよね
ラマ2を
自分で書いてみるっていうのは一つ面白いことかなと思ったりもしてるし
推論用に
Cで書いてるのが今回のプロジェクトですけども
GPTの推論用のCで書くとか
そういうのも面白いんじゃないかなと思ったり
あと論文でこれを押さえておきたいなと思ってたって言った
RWKVとか
RedNetとか
オフィシャル実装とかもうすでに出てるってありますけども
論文から
チャチャチャってね
GPTのノリラマ2のノリで
実装できるでしょうか
それやってみたら面白いんだよね
もちろんラージランゲージモデルが本当に面白いのは
何度も言ってるように繰り返しになってますが
でかいデータセットで学習して
結果がわーって出るっていうところなので
そこの醍醐味はなかなか
個人では味わえないだろうけども
こういうモデルのウェイトがね
公開されるの
そこは待つしかないんだけどラマ2は公開されてるから
そこは遊べるよね
ジェレミーがねふっかけてたねアンドレイにね
GPTのウェイトも早く出させろよみたいなね
出たら面白いよね
出たら面白いよね
首を長くして待ちましょうって感じですけども
はい
これ遊びたいことのリストなんだけども
このプロジェクトに関して時間がありませんでした
じゃあ今日は何をやったのっていう話ですが
今日は
モデルファイルの変換の部分について
ちょっともやもやとしてなんですね
このプロジェクトを見始めてどっから手をつけようってか
面白いことやりたいなと思った時に
まず
このモデルファイルの変換
ちょっとイラっときた
何がイラっときたかっていうと
これは貧乏人由来の話なんだけども
これは
ラマードットCPP
のプロジェクトも
PyTorchのウェイトから
GDMLタイプのモデルにあらかじめ変換しとかないと
使えませんよっていう話をしました
で
CapaCのラマー2.c
プロジェクトで
推論のRAN.cで使うためには
同じようにウェイトファイル
PyTorchのウェイトファイルを
変換する必要がある
で、どちらのプロジェクトも
変換プログラムはPythonで書かれている
Pythonか
って
なんでPythonかっていうと
僕のこのMacはね
Python入ってるんだけどネイティブにね
今の
Docker時代の
プログラマーの人たちは
共感してもらえると思いますが
ネイティブ環境の
Pythonの環境って
なるべく触りたくないですよね
うん
で、僕もその気持ちなんですけども
じゃあDocker環境を建てればいいじゃないかっていうのが
今までの僕のアプローチだったんですが
で、それは大半のエンジニアの
開発者のプログラマーの
今流のアプローチだと思うんですが
さっき言ってるように
このMacもいい加減古すぎてですね
OSはKatarinaで止まっちゃってるし
一番痛いのは
ついにDockerが
サポートされなくなっちゃった
Dockerが使えなくなった
Docker自体がCPUでもいいよって言ってもDockerが使えないんで
Dockerの
環境を建てるっていう形の
仮想環境っていうか開発環境を整備するっていうのが
僕の
ローカルマシーンでできなくなっちゃって
だからもうPython
は動かしたくない
それじゃいかん
今2023年でAIをやりたい人が
それじゃいかん だからまあ
Googleコラボとか必要に応じてやるんだけども
ラマ2に関してはさっきも言ったように
モデルファイルがねGoogleドライブに
僕もう乗らないので
そっちも積んじゃってるんだよね
だから最初に思ったのは
モデルファイルの変換 このね
ラマ.cppとか
Androidのラマ2.cにおける
PyTorchのウェイトを
それぞれのバイナリーにするっていう部分も
これ
Python依存外すと
ハッピーになる人世の中にいるんじゃないかなと思って
できないかなってちょっと考えてみたんです
ね
でいろいろやったんだけども
結果を先に言うとですね
そういう無駄が多いことは
まあ皆さんやらない方がいいですよっていうのが
結論みたいですね
なので成果が何もない
努力になりましたが
一通り進めます
はい
Androidのこのラマ2.cにおける
モデルファイルの変換プログラム
がどういうものかちょっと見ていきましょう
っていうところから始めます
エクスポート
メタラマ
.pyっていうPythonスクリプトが
それです
これ中身見ればPythonで
どうやってPTHファイルを
このねラマ2.cが使う
binファイルに変換するかっていう処理が
全部書かれているのでわかるでしょう
でね
こいつはね
依存性として
配当値?
当地を要求してるのね
当地モジュールを
それがなかったらねまだね
僕も最初からねこんな.cに
コンバートしたいなとか思わなかったんだけど
あったのよ
まあでもどういう流れで処理されるかっていうのは
これ見れば全部わかるなと思ったわけね
ok
そんで
今日昨日から今日にかけて
日数カウントでほぼ半日を潰して
成果が得られなくてがっかりしてるんですけど
すみます
ポイントはねPTHファイルを
.cできちんと開ければ
開いてきちんと中身を把握できれば
そいつを.binファイルに
セーブするのは.cで別に
なんなくできるはずなんで
PTHファイルってのは何なんだっていうことを理解することが
最初だろうと
ここは後で書こうと思って
完成してない
有所正しくこれをやるにはっていうのは
実は配当値が
準備してることが判明しました
その仕組みっていうのは
統治スクリプトっていうものですと
統治スクリプトの存在意義は何かっていうと
今ね
推論はcで書いたみたいな話が
ポンポンってプロジェクト2つ出てきましたけども
ニーズとして学習は
当然PyTorchとか
Cypherflowとかね
Pythonでの開発環境でやると
やる必要がある
できあがったモデルを実際に
プロダクションで使う実行環境っていうのは
状況によっては
Pythonみたいな
重たい処理系とか
使いたくないみたいなニーズが
あるんですね時々
Edgeとかなのかな
そういう環境に
エクスポートするニーズがあるので
それをサポートする仕組みとして
PyTorchが提供してるのが
統治スクリプトっていう
フレームワークなのかなツール群なのかな
やってることは何かっていうと
構築されたモデルで
保存されたウェイトを
C++で使えるように
変換するためのツール
みたい公式ドキュメントとかいっぱいあります
がどうも
俺が欲しいものじゃないっていう結論になった
その理由は
変換コード自体は
まだPythonで書かなきゃいけない
そういうフレームワーク
だからこれ俺いいと思ったんですね
っていうのは目的は当初の目的は
PTHファイルがあります
あとは全部Cだけで書きたい
Python抜きで書きたいっていうのが僕の理想だったので
ダメじゃん
スクラッチから行かなきゃいけないね
PTHファイルって何者っていうのを
理解しようと
知らんかったのっていう話で今回学びましたけども
パースするね
上のアンドレイの書いた
エクスポートメタビン
Pyを読めばいいんですが
これ言ってるように統治モジュールを使ってるから
チートっていうか
それ違うやろうと思って
それを読んでも
僕が知りたい情報に
ゲットできないだろうと思って
LAMA.cppのプロジェクトにある
変換プログラムこれもPythonで書かれてるって言いましたが
コンバートっていうPythonスクリプトがあるんですが
こいつは
ポーチに依存してないよね難パイは必要だけども
Pythonで書かれてるんだけども
基本的には
スタンドアローンなPythonスクリプトっていう
ような雰囲気だったのでこっちで処理を読んでみよう
って思ったんですね
読んだ結果わかったことは
PTHってファイルは何かっていうと
ZIP圧縮された
バイナリーファイルです
なるほど
じゃあZIPで
復元したら中身が見れるのねと思って
さっきダウンロードしたっていう
LAMA2の7BillionChatの
PTHファイルがありましたね
Consolidated00PTHってファイル
それ普通にデカいんだけど
普通にUnzipしてみたら
Consolidatedっていうフォルダが
一つできてその下に
こういうファイルが展開されたと
これだけかとこれがPTHファイルの正体かと
見たら
データっていう下には
おそらくはバイナリーデータであろうものが
01234...291まで
あって
そのData.pkl
Python使いの人は
ピクルや
なるほどと
じゃあピクルって
なるほどと
じゃあピクルをCでシリアライズできれば
読み込むことができるね
っていうことはわかった
これがPTHファイルの
中身だっていうことはわかった
じゃあもう簡単やんと思ったんだけどね
ピクルをCだけでどうやって
そもそもピクルって何ですかって
ピクルのシリアライザーなんですけども
これをね
スタックオーバーフローさんとかにね
僕はChatGPTを手下には使ってないんで
それは
頭脳の老化を引き起こすと思ってるんで
古き良きスタックオーバーフローさん
ってかググってんですけども
スタックオーバーフローさんとかいろいろ聞くと
ピクルをパース
読み込みたければ素直にPythonを使え
っていうのが
ソリューションで
なければCからPythonを使え
っていうようなソリューションが出るぐらい
なので直接Cで
このバイナリーファイルを読んで
パースしてみたいなのは
どこにも引っかからなかった
それぐらい多分大変っていうか
想像するに
シリアライザーっていうか
このデータを
メモリからファイルに
ファイルからメモリにっていう部分で使う仕組みが
今のPythonの環境ではピクルっていうのが
まずシステムで導入されて
いろいろライブラリとか使いたければあるんだけども
その状況自体がね
データの変換
ツールが真ん中にいるのがピクルで
入り口はメモリに乗っかってる
データで出口は
ファイルシステム上にある
バイナリーファイルで
この間を繋ぐのがピクルなんだけど
キッチンシンクのようなことに
目的からするとこの入り口と出口の
クリーンさが
そもそもの目的だから
中立性っていうかね
だからしかるべきものなんだろうなと思ったし
そういう意味では
Python使う以外のことは
考えられてないものなんだなっていう風に
思ったんですね
半日潰してもう後半ね
結論
PHTファイルはPythonで使う
だってこれはもうPythonで読み込むんだったら
もう一行で終わりみたいな話だからね
そこにどれだけ努力するんだみたいなのを頑張ってたんだけど
もういいと
で後じれ的に振り返って考えると
2つのプロジェクト
歴戦の強者2人がですね
揃いも揃って変換ツールPythonで書いてる
わけだから察するべきだった
いい勉強になりましたって
PTHがZIPで圧縮されてるっていうことは
わかったと
めでたしめでたしとしようと
そういうことね