さて､ 皆さんは私が「真実の瞬間が来た」と言うのにうんざりしていると思うが､ 本当に来たのだ｡
真実の瞬間がやってきた｡
おそらくお分かりになると思うが､ 私は非常に興奮している｡
これは我々にとって大きな出来事であり､ 大きな､ 大きな瞬間だ｡
まず最初に､ 我々は7週目3日目のColabにいるのだが､ 正直に告白すると､
私はColabの箱の中で最も高価なA100 GPUの箱を選んだという､ ちょっとエッチなことをしている｡
11を食い尽くす｡ 77ユニットで1時間あたりの計算単位を算出し､ 現在のレートは､ 私の記憶が間違っていなければ､
だいたい100ユニットで10ドルくらいだと思います｡
つまり､ これは1時間に約1ドルを費やしていることになる｡
ええと､ 今現在､ その値段は時々変わるんだ｡
うーん､ そうだね､ これはいつものように安くはないよ｡
そして､ こんなことをする必要はない｡
間違いなく使えるよ｡
ええと､ ランタイムのタイプを変更してください｡
t4GPUを使用している可能性があります｡
そのためにどのパラメーターを変更すればいいかを教えよう｡
うーん､ でも､ もしあなたが数ドルの出費を気にせず､ 爆走したい､ ハイパーパラメーターを変更し､
速くトレーニングしたいのであれば､ しばらくA100ボックスを持って､ 40GBのGPU Ramを搭載したボックスの生のパワーを体験するのは美しいよ｡
なぜなら､ このようなジューシーでパワフルなボックスがあるのはとても喜ばしいことだからだ｡
とにかく､ まずはpipのインストールから始めよう｡
これには､ HuggingfaceのTRL Transformers Reinforcement Learningというライブラリがあり､
SFTトレーナー監修のFine Tuning Trainerが含まれています｡
前回のビデオでは､ トレーニングについて少しお話しましたが､ その際､
ハイパーパラメータについてお話し､ フォワードパスとバックワードパスのトレーニングプロセスについて少しお話しました｡
そしてまた､ ある人たちにとっては､ このことはもう古いことで､ よく知っていることだろう｡
トレーニングの全過程をもっと時間をかけて説明できないのか？
そして､ ひとつ言いたいのは､ ハグフェイスのおかげで､ このことがとても身近に､ とても簡単になったということだ｡
モデルをトレーニングするための参入障壁を低くしているので､ 最適化や正しい方向へのステップを踏む上で､
何が起こっているのか直感的に理解することは非常に役に立つ｡
理論の詳細を知ることは必須ではない｡
ハイパーパラメーターを微調整できるくらいの知識があればいいんだ｡
パラメーター
顔をハグすることで､ トレーニングは驚くほど簡単になる｡
だから､ もし頭から抜けてしまったと感じたとしても､ それは本当に重要なことではないので安心してほしい｡
規約を見れば一目瞭然だ｡
そして､ もしあなたがすでにこのようなことを隅から隅まで知っていて､ 最適化に精通しているのであれば､ それは素晴らしいことだ｡
そうすればもっと良くなる｡
そうすればもっと簡単になる
よし､ では輸入をいくつかやってみよう｡
そして今､ 私たちは話すべきたくさんのパラメーターを持っている｡
ベースモデルはもちろんラマ3だ｡ 180億ドル
私たちはそのプロジェクト名をよく知っている｡
つまり､ これがウェイトとバイアスで使われるプロジェクト名だ｡
そうなったら､ その結果を比較するんだ｡
そして､ ハギング・フェイスのハブにアップロードする際にも使う｡
そして､ このプロジェクトにはプライサーという名前を使っている｡
GPTをトレーニングしていたとき､ 私はそれをプライサーGPTと呼んでいたのを覚えているかもしれない｡
プロジェクトは別々にしているのは､ 結果があまりにも異なるからだ｡ 異なる量を計測するというだけで､
同じプロジェクトにすると混乱するだろう｡
ええと､ だから､ 僕はこれをただのプライサーと呼んでいるんだ｡
ええと､ ハギング・フェイスのユーザー､ ここにハギング・フェイスの名前を入れるべきだよ｡
ええと､ あなたが微調整したモデルを大事にし､ 将来的に使用するために､ モデル用のハブにプッシュ投稿したくなるでしょうから｡
また､ 非公開にすることもできる｡
ええと､ 自分で食べるだけだよ｡
データに関しては､ データセットをロードする必要がある｡
そしてここで､ あなたには選択肢がある｡
数週間前にデータ・キュレーションを行った際に､ ハギング・フェイスのハブにデータセットをアップロードしたのであれば､
この行をそのままにしておけば､ ハギング・フェイスのユーザー名とプライサー・データが表示され､
それを読み込むことができます｡
あるいは､ もしあなたが､ その1本だけを見て､ 僕がデータセットをやっているのを見ようと決めたとしても､ それをHuggingfaceにアップロードしなかったとしたら｡
残念だ｡
それでも､ かなり多くのことがあったことは理解している｡
ハードコードしたこの行をコメントアウトすればいい｡
そこにFは必要ない｡
ええと､ 僕のハブにはデータの価格をハードコーディングしてあるんだ｡
そこでダウンロードすればいい｡
素晴らしい｡
自分でアップロードする必要はない｡
それから､ 最大配列長ですが､ データは常に179トークン以下になるように作られていることを思い出してください｡
文頭の数トークンと､ 末尾のガムテープのようなものを加えて､ 最大配列長182ということになります｡
これは非常に重要なことで､ すべてのトレーニング・データ・ポイントがこれに適合することになるからだ｡
そのため､ GPUのメモリに収まるような小さな数値にする必要がある｡
そのため､ この金額内に収まるように説明を削っている｡
それで､ いくつか､ ええと､ 管理的なことなんだけど､ それぞれのランにランネームというものを考えたんだ｡
月だ｡
曜日と時間
分｡
セカンドだ｡
その理由はすぐにわかるだろう｡
プロジェクト・ラン名と呼ばれるもので､ Pricer､
ハイフン､ 日付､ そしてモデルを保存するハブモデル名がユーザー名になります｡
そしてこれだ｡
ええと｡
そして､ なぜ私はこんなことをしているのか｡
だから時々､ 1つのモデルだけを持ちたがる人がいる｡
そしてこれを実行しながら､ 同じモデル・リポジトリに対して保存する異なるバージョンをアップロードするだけだ｡
Huggingfaceのすべてが単なるgitレポであることを覚えておいてほしい｡
だから､ 基本的には､ 新しいバージョンのコードをチェックインしたり､ 新しいバージョンのコードをプッシュしたりするだけで､
新しいバージョンのモデルをプッシュし続けることができる｡
同じモデル名でもバージョンが違うだけかもしれない｡
しかし､ 私は自分の異なるランを分けて､ それぞれを異なるモデルとして持ちたいんだ｡
ハイパーパラメーターを変えてトレーニングすることもあるし､ そのメモを残しておきたいからだ｡
だから､ それが僕の好きなやり方なんだ｡
厳密には必要ではないが､ 役に立つと思う｡
その感覚を味わってもらうために､ ランネームをいくつか挙げてみよう｡
今､ ランの名前をお見せしましょうか？
ランネームは､ 22日という現在の日付と､ 現在の時刻です｡
その時間は協定世界時（UTC）である｡
実はまだ午前0時4分じゃないんだ｡
ええと､ それがランの名前なんだ｡
それからもうひとつは？
プロジェクト・ラン名とハブ・モデル名がある｡
だから､ プロジェクト・ランの名前はPricerと続くだけだ｡
そして､ アップロードされるハブのモデル名｡
そうなのか？
これは､ 実行後にその名前のモデルを作成することになる｡
モデル・ディレクトリを見ると､ このようなものがたくさんある｡
でも､ とても楽しかった｡
あ､ この手の値段の高いモデルはたくさん持っているよ｡
みんな走っていたよ｡
ええと､ それで最後に､ ええと､ あそこで接続が切れたり切れたりしてるのが見えるんだけど｡
トレーニングに使うハイパーパラメータは､ 行列の次元です｡
ええと､ 32から始めます｡
だから､ それを8つまで減らすことができる｡
特に下位のボックスで走っている場合はね｡
大丈夫だよ｡
ええと､ ローラ､ アルファはダブルRのはずだよ｡
ええと､ これを8つに減らすと16になる｡
もちろん､ ターゲット・モジュールだ｡
あなたはそれを知りすぎている｡
それが何であるかは言うまでもない｡
そして､ これがラマ3世のスタンダードなものだ｡
これらは､ あなたがターゲットとするモジュールである｡
ローラの脱落は､ 前回かなり長い説明をしたことだ｡
正則化､ つまりモデルが新しいデータポイントに対してうまく汎化できるようにするためのトリックで､
ニューロンの10％（この場合は10％）を取り出し､ それらを消去してアクティブ度をゼロにする｡
その結果､ モデルは特定のニューロンに過度に依存することはない｡
モデル全体がトレーニングポイントを受け取り､ 正しい次のトークンを与えることができるようになるよう､
一般的に学習しているのだ｡
10%は10である｡ 1は非常に典型的な出発点だ｡
5％と20％を試してみて､ そのパフォーマンスとビットの量を見てみるべきだ｡
その通りだ｡
これは4ビットに量子化することである｡
オーケー｡
トレーニング用のハイパーパラメータ｡
私はこれを3エポック実行するように設定した｡
一人だけならできるだろう｡
ぜひとも､ 1回のバッチサイズで申し分のない結果が得られるだろう｡
私はここで16番を任された｡
ええと､ 一緒に必要ですか？
ジューシーなA100の箱で？
私は16バッチで包装できる｡
これが最大シーケンス長であることを考えると､ すべてのシーケンスを詰め込んでも､ 40GBのメモリにギリギリ収まる｡
うーん､ でも､ もしT4のようなローエンドボックスを使うつもりなら､ これを試してみるのもいいかもしれないね｡
もっと高くしてみて｡
もしGPUメモリが増えたとしても､ それはまだ無料だ｡
バッチサイズには2のべき乗を使うという慣例があるんだ｡
つまり､ 1か2か4か8か16か｡
理論的には､ 2のべき乗にするとGPUが並列化しやすくなり､ パフォーマンスがわずかに向上するという､
さまざまなゆるい証拠があります｡
でも､ そのデータはいつも､ ちょっと曖昧なんだ｡
だから一般的に言って､ GPUにもうちょっと多くのバッチを詰め込めるなら､ そうすべきだと思う｡
だから､ 私は3人分のバッチを作ることをためらわない｡
それをGPUに搭載できれば､ 2つのバッチサイズよりも高速に実行できるだろう｡
ええと､ もしかしたら､ 4つあれば､ もう少し､ もう少し効率的になるかもしれない｡
ただ､ 一般的なアドバイスとしては､ GPUに搭載できるものなら何でもいい｡
私のように大枚をはたくのでなければ､ 16段のグラデーション蓄積を目指そう｡
それは前回説明した｡
実際､ これはプロセスの記憶を向上させるのに役立っていると思う｡
ああ､ やってみてもいいけど､ でも僕は1人でいるよ｡
2､ 4番でも試すことができる｡
学習率......超重要なのは､ 正しい方向への一歩を踏み出そうと最適化するときに､ どれだけの一歩を踏み出すかということだと理解していると思う｡
そして学習率は､ 実験が必要な超重要なハイパーパラメーターだ｡
うーん､ これは正解がないことのひとつなんだ｡
学習率は高すぎるかもしれないし､ 低すぎるかもしれない｡
あなたが達成しようとしていることは､ 少し手探りなものになるだろう｡
繰り返しになりますが､ あなたが達成しようとしているのは､ あなたのモデルの本当の損失が､ このように大きなくぼみを持つものだと想像することです｡
そして､ あなたはこの谷を見つけようとしている｡
そして､ 谷の方向に沿ってステップを踏み､ 谷の底にたどり着くように下がっていく｡
学習率が高すぎると､ 谷を飛び越えてはまた戻り､ 実際に谷に降りることはないかもしれない｡
学習率が低すぎる場合
小さな小さなステップを踏みながら､ その谷に向かって2歩ずつゆっくり進んでいるかもしれない｡
小さなステップを2つ踏むことには､ もう一つ問題がある｡
仮に大きな谷が1つだけでなく､ 小さな谷と大きな谷があるとする｡
学習率が低すぎると､ 小さな一歩を踏み出しても､ 小さな谷に沈んでしまうかもしれない｡
そして実際､ あなたが踏み出す小さな一歩一歩は､ 小さな谷の二つの壁を登っていくだけで､ その小さな谷から出ることはない｡
だから､ すぐ隣にもっと大きな価値の谷があったことに気づかない｡
それが重要な問題だ｡
学習率が小さすぎるのはよくある問題だ｡
人はそれをローカルミニマムから抜け出せないと呼ぶ｡
これはミニマムと呼ばれるもので､ あなたがいる場所のローカルなものだ｡
ローカル・ミニマムから抜け出せないので､ グローバル・ミニマムはまだ見つかっていない｡
そしてそれが､ 学習率が低すぎることの問題なのだ｡
こんな素敵なトリックがある｡
学習率は0を選んだ｡ 10の00011乗マイナス4｡
学習率スケジューラーというものを使うと､ 学習率を変化させ､ 3回のエポックの間にどんどん小さくしていき､
3回のエポックが終わるころには学習率がほとんどゼロになるようにする､
いいトリックがある｡
ええと､ そして､ あなたはそれを与えることができる｡
これらのいずれかを使用する場合は､ 異なる形状を与えることができる｡
そしてコサインはとてもいいもので､ 学習率が徐々に低下していくところから始まり､ その後かなり低下していく｡
そして最後には尻すぼみになる｡
すぐに視覚的にわかるよ｡
そして､ それは本当に良い､ 良いテクニックだ｡
最終的な学習率のパラメーターはウォームアップ率と呼ばれるもので､ 学習プロセスの最初の段階では､
モデルは最初の数データポイントから多くのことを学ばなければならないため､ かなり不安定になると言っています｡
それに､ 最初に学習率を大きくするのはかなり危険だ｡
つまり､ ウォームアップの比率は､ 低い学習率から始めて､ ピークとなる学習率までウォームアップさせるということだ｡
そしてコサインのトレイルを始めるんだ｡
そして､ それを視覚的に見ることができる｡
だから､ もっと意味がある｡
しかし､ これらは非常に賢明な設定だ｡
しかし､ 学習開始率を高くしたり低くしたり､ スケジューラーの種類を変えてみたりすることは間違いなくできる｡
そして最後にオプティマイザーだ｡
だから､ ここではページングされたアダムwを選んでいる｡ wとは､ ページングされたアダムw 32ビットのウェイト減衰を意味する｡
これは収束性の良いオプティマイザーだ｡
最適な場所を見つけるのは良い仕事だが､ その代償としてメモリを消費する｡
ええと､ あなたが選ぶことのできるさまざまなオプティマイザーについてのハグフェイス・ライトアップへのリンクをここに貼っておきます｡
ええと､ トランスフォーマーで最も一般的なのはアダムかアダムであることは明らかです｡
アダムは､ 過去の勾配のローリング平均を保存し､ 最新の勾配だけでなく､
それを使うからだ｡
しかしもちろん､ それを保存することで､ 余計なメモリ・フットプリントが必要になる｡
だから､ ちょっとメモリに貪欲なんだ｡
だから､ もしメモリが足りなくなったら､ より安価で､ より貪欲でないオプティマイザを選んでメモリを節約するという選択肢もある｡
しかし､ その結果は､ ページングされたアダムを使うよりも若干悪いかもしれない｡
そして最後に､ いくつかの管理設定を行う｡
ええと､ このステップ数は､ その前に何回バッチステップを踏むかということです｡
ウエイトとバイアスに進捗状況を保存し､ 物事の進捗状況を示してくれる｡
モデルを実際にハブにアップロードし､ 適切なバージョンを保存するまでに､ このようなステップがあります｡
これは､ ウェイトとバイアスにログを取るかどうかということで､ パラメーターのツアーになる｡
そして次回は､ 本当にトレーナー自身に迫っていく｡