WEBVTT 00:00.440 --> 00:08.390 さて、 Jupyter Labにようこそ!このプラットフォームでの時間の壮大なフィナーレを飾ることになるだろう。 00:08.570 --> 00:14.540 そして、 この7週間を締めくくる素晴らしいものになるだろう。 00:14.600 --> 00:19.130 まず気づくのは、 8週目のフォルダーにはかなり多くのことが起こっているということだ。 00:19.130 --> 00:26.660 これは、 この大きな問題を解決するために、 私たちが多くの仕事をこなさなければならないという事実を反映している。 00:26.960 --> 00:31.010 つまり、 このコードを読み進めるにあたって、 いつもより速いペースで進むということだ。 00:31.010 --> 00:36.860 でも大丈夫、 この時点であなたはLLMエンジニアリングをマスターしているのだから。 00:36.860 --> 00:44.210 アシスタントのディクテットやユーザーのリストなど、 もはや私が長々と説明する必要はない。 00:44.210 --> 00:48.200 それはもう、 非常に古いニュースだ。 00:48.410 --> 00:54.770 ほんの数週間前まで、 トークンが何なのかを説明していたなんて。 00:54.770 --> 00:59.230 そして今、 あなたは大規模な、 完全なエージェントAI Iの準備ができている。 00:59.260 --> 01:02.830 始める前に、 簡単な管理上の注意点を説明しよう。 01:02.890 --> 01:07.480 パッケージを少し変更したんだ。 01:07.480 --> 01:14.650 この環境に依存するパッケージをいくつか追加した。 01:14.770 --> 01:20.950 つまり、 9月下旬以前にコードを取得した場合は、 私が追加した新機能を追加するために、 再度コードを取得し、 01:20.950 --> 01:26.380 パッケージを更新する必要があるかもしれないということだ。 01:26.380 --> 01:27.970 それはとても簡単なことだ。 01:28.000 --> 01:32.050 もちろん、 プロジェクトのホーム・ディレクトリに行けばいいだけだ。 01:32.050 --> 01:33.640 だからLMエンジニアリングだ。 01:33.760 --> 01:37.480 PCを使っているなら、 Anacondaプロンプトに入る必要があります。 01:37.720 --> 01:43.540 それからgit pullして最新のコードを取得し、 conda env updateを実行する。 01:43.780 --> 01:52.480 ええと、 ファイルをenvironmentとして指定します。 ymlとdash dash pruneは、 リストにもうないパッケージを削除するように指示する。 01:52.480 --> 01:57.400 私は何も削除していないと思うが、 とにかく、 これは常に賢明なあー、 ワンライナーだと思う。 01:57.430 --> 02:02.330 新しい環境にアップデートするために、 それを手元に置いておくのは良いことだ。 ymlファイル。 02:02.750 --> 02:05.540 さて、 それでは始めよう。 02:05.540 --> 02:07.160 モーダルについて話そう。 02:07.160 --> 02:12.140 だから今日の授業では、 まず輸入品は1つしかない。 02:12.140 --> 02:13.970 そして、 モーダルをインポートすることである。 02:14.000 --> 02:15.080 これでよし。 02:15.170 --> 02:25.190 トークンをセットアップしていない場合は、 モーダルセットアップと呼ばれるコマンドラインを実行する必要があります。 02:25.190 --> 02:31.010 その実行方法は、 この行のコメントを解除して、 そのステートメントを実行するだけだ。 02:31.040 --> 02:34.910 今、 私はそれをするつもりはない。 なぜなら、 私の環境はすでにセットアップされているからだ。 02:34.910 --> 02:42.710 しかし、 そうすると、 ブラウザ・ウィンドウがポップアップし、 モーダルを承認しなければならなくなる。 02:42.710 --> 02:46.190 そして、 モーダルがあなたの代わりに環境変数を設定する。 02:46.190 --> 02:47.900 それは本当に素晴らしいことだと思う。 02:47.990 --> 02:55.160 トークン、 特にOpenAIで人々が抱えていた課題はすべて、 これはまったく異なる経験だ。 02:55.160 --> 02:56.570 実に合理的だ。 02:56.570 --> 02:57.670 モーダルにはとてもいい。 02:57.670 --> 03:01.990 彼らはトークンをセットする方法を本当に理解しているようだ。 03:01.990 --> 03:07.000 何らかの理由でそれがうまくいかない場合は、 モーダルプラットフォームに行けば、 OpenAIのようなものと同じように、 03:07.000 --> 03:11.590 トークンを見つけることができます。 03:11.590 --> 03:13.810 そして、 手動で設定することができる。 03:13.930 --> 03:16.690 うーん、 でもうまくいけばいいんだけど 03:16.690 --> 03:17.860 確かに私にはそうだった。 03:17.860 --> 03:22.150 誰の目から見ても、 それが一般的な人々のための方法だ。 03:22.690 --> 03:23.650 分かった。 03:23.650 --> 03:31.750 次の行では、 helloというパッケージからいくつかのものをインポートします。 03:31.750 --> 03:35.140 これから、 その様子をお見せしましょう。 03:35.560 --> 03:37.990 つまり、 これはPythonの一部なんだ。 03:37.990 --> 03:39.880 ただのPythonのコードだよ。 03:40.090 --> 03:41.590 そして、 それが何をするものなのかを教えよう。 03:41.590 --> 03:43.150 そこで、 モーダルをインポートする。 03:43.150 --> 03:46.150 そして、 モーダルからいくつかのものをインポートする。 03:46.180 --> 03:51.130 アプリケーションのボリュームとイメージのためのアプリ。 03:51.340 --> 03:55.060 それに、 今見てみると、 結局ボリュームは使っていないんだ。 03:55.060 --> 03:56.840 だから、 その必要はないと思う。 03:56.870 --> 03:58.700 シンプルな方がいい。 03:59.240 --> 04:02.300 それで、 こうするんだ。 04:02.330 --> 04:03.650 まずはセットアップから始める。 04:03.650 --> 04:07.070 どのようなインフラが必要かをモーダルに伝える。 04:07.070 --> 04:11.030 これはモーダルの例で、 ドキュメントで少し触れています。 04:11.030 --> 04:15.260 しかし、 これはコードとしてのインフラの一種である。 04:15.260 --> 04:19.430 どのような箱が欲しいかをコードで記述することができる。 04:19.460 --> 04:24.320 Google Colabでは、 いろいろなドロップダウンを選んで、 04:24.320 --> 04:34.430 どんなVMが欲しいか、 どんなランタイムが欲しいかを選ぶ必要があった。 04:34.430 --> 04:40.760 つまり、 Debianオペレーティング・システムのイメージが欲しいということだ。 04:40.760 --> 04:48.530 pipでrequestsパッケージをインストールしたい。 このパッケージは、 URLウェブ作業を行うための、 04:48.530 --> 04:52.010 とても一般的な標準パッケージだ。 04:52.370 --> 04:59.650 そして、 GPUを指定するのだが、 これもこの例では使わない。 04:59.650 --> 05:00.520 申し訳ない。 05:00.700 --> 05:01.780 これで少しシンプルになった。 05:01.780 --> 05:05.800 この例ではGPUを使うつもりはない。 非常にシンプルにしているからだ。 05:06.160 --> 05:10.660 helloというメソッドがある。 05:10.690 --> 05:11.740 とてもシンプルだ。 05:11.740 --> 05:12.640 それは機能だ。 05:12.640 --> 05:13.150 こんにちは。 05:13.180 --> 05:14.710 これは文字列を返す。 05:14.950 --> 05:25.120 それで何をするかというと、 リクエストをインポートして、 IP情報というウェブサイトにアクセスするんだ。 これは知っておくと便利だ。 05:25.120 --> 05:35.560 JSONオブジェクトを返すユーティリティのひとつで、 IPアドレスの場所を記述している。 05:35.800 --> 05:44.710 そのJSONから都市、 地域、 国を抜き出し、 都市、 地域、 国からこんにちはと言う。 05:44.860 --> 05:46.840 ええと、 IPアドレスに基づいているだけです。 05:46.870 --> 05:52.540 だから、 あなたがどこにいようと、 少なくともISPがどこからあなたにサービスを提供していようと、 こんにちはと言うだけだ。 05:52.550 --> 05:57.710 だから僕にとっては、 ニューヨークにかなり近い場所になるだろうけど、 ニューヨークではないかもしれない。 05:57.980 --> 06:01.520 それはとてもシンプルな機能だ。 06:01.550 --> 06:07.850 このデコレーターはグラデーション・デコレーターで、 06:07.850 --> 06:13.490 アプリでデコレートされています。 06:13.490 --> 06:15.560 ハロー・ドット・ファンクション 06:15.620 --> 06:18.020 そして、 この画像の中を通過する。 06:18.020 --> 06:25.190 そして、 そのイメージはDebianのイメージを指しており、 そのイメージにはリクエストがインストールされている。 06:25.190 --> 06:33.860 このような装飾を施すことで、 我々が望めばこのような箱でこれを走らせることができると言っているのだ。 06:33.950 --> 06:35.510 それだけだ。 06:35.510 --> 06:37.940 だから、 そのことは横に置いておいてほしい。 06:37.940 --> 06:41.480 これは既存のコードの一部だと想像できるだろう。 06:41.480 --> 06:47.420 あなたは何かをしなければならなかった。 そして今、 あなたはそれを、 Debianオペレーティングシステムを使い、 06:47.420 --> 06:53.710 リクエストをインストールした上で、 それを実行できるようにしたいという言葉で飾った。 06:53.920 --> 06:57.520 このハローワークにあるのは以上だ。 パイ。 06:57.550 --> 06:59.020 超シンプルだ。 06:59.080 --> 07:03.790 初日のドット、 ジュピター・ノートブックに戻ろう。 07:04.420 --> 07:08.620 だから、 これからそれをインポートする。 07:08.740 --> 07:18.340 そして今できることは、 ここでインポートしたhello関数を呼び出すことだ。 07:18.370 --> 07:22.930 そして、 ハロー・ドット・ローカルと言って呼ぶことができる。 07:22.930 --> 07:30.730 つまり、 先ほど定義した関数を、 ローカル・ボックス上で実行したいのだ。 07:30.730 --> 07:32.920 このJupyterノートブックで実行したい。 07:33.130 --> 07:34.270 何が出てくるか見てみよう。 07:34.600 --> 07:36.460 だから、 今走っている。 07:37.300 --> 07:40.900 アメリカ、 ニューヨークのシーポートからこんにちは。 07:40.930 --> 07:43.600 そこが私のISPなんだと思う。 07:44.050 --> 07:44.920 もう一度やってみよう。 07:44.950 --> 07:46.450 ああ、 それはかなり一貫しているようだ。 07:46.450 --> 07:48.340 これがローカルで動いているわけだ。 07:48.970 --> 07:53.370 それと、 これを見てくれ。 07:53.400 --> 07:55.440 まったく同じことだ。 07:55.470 --> 07:58.260 ローカルをリモートに変更したところだ。 07:58.260 --> 07:58.920 それだけだ。 07:58.950 --> 08:00.360 唯一、 変えたことがある。 08:00.990 --> 08:02.400 どうなるか見てみよう。 08:05.850 --> 08:07.740 もう少し時間をかけてからにしよう。 08:07.770 --> 08:11.070 バージニア州アッシュバーンからこんにちは。 08:11.100 --> 08:17.910 まったく違う状態で走っているから、 それを期待しているんだろうね。 08:17.910 --> 08:19.020 おわかりだろう。 08:19.350 --> 08:21.060 あー、 時には違うこともある。 08:21.060 --> 08:23.820 ちなみに、 あちこちで見かけるようになった。 08:23.820 --> 08:31.920 つまり、 ローカルではなくリモートを呼び出すだけで、 同じコード、 同じPythonコードを呼び出すことができる。 08:31.920 --> 08:36.570 そしてそれはサーバーにデプロイされ、 代わりにそのサーバーで動いている。 08:38.280 --> 08:39.780 それはとても不思議なことだと思う。 08:39.780 --> 08:44.580 とてもシンプルで、 いくつかのコードをデプロイするだけでいいのだから、 魔法のようだ。 08:44.760 --> 08:47.970 そして今、 私たちはllamaという少し複雑なパッケージを手に入れた。 08:49.000 --> 08:52.030 そしてここからGPUのようなものが登場する。 08:52.030 --> 08:57.880 ハローの例と対になっているのがわかるだろう。 08:58.240 --> 09:04.120 まず、 自分のアプリのラマに電話するんだ。 09:04.750 --> 09:10.030 ええと、 もう一度Debianのイメージを作りますが、 今回はtorch transformers、 bits and bytesをインストールして、 09:10.030 --> 09:13.360 皆さんが知っているすべてのパッケージを加速させます。 09:13.360 --> 09:22.390 まあ、 この時点で、 うーん、 僕はモード・シークレットからハグする顔のトークンも手に入れている。 09:22.390 --> 09:27.310 モーダルでどのように設定するか、 どのようにシークレットにアクセスするか、 どのようにハグする顔のトークンを設定するか、 09:27.310 --> 09:29.320 すぐにお見せしましょう。 09:29.350 --> 09:32.170 そうしたら、 こう読むことができる。 09:32.830 --> 09:39.430 そして、 私はT4 GPUが欲しいと指定しているのですが、 それはもちろんとても安いベーシックなものです。 09:39.520 --> 09:41.470 そして、 ここには不変のものがある。 09:41.950 --> 09:47.910 そして今、 私はこの、 この、 生成機能を手に入れた。 09:47.910 --> 09:51.990 そして、 文字列であるプロンプトを受け取り、 文字列を返す。 09:52.770 --> 09:54.480 これはタイプのヒントの例である。 09:54.480 --> 09:55.920 ご存じない方も多いだろう。 09:55.920 --> 10:00.360 今回もいろいろなところでやることになるだろう。 10:00.360 --> 10:04.920 そして、 それは......少し経てば明らかになると思う。 10:05.430 --> 10:13.110 この関数を装飾して、 画像を渡し、 秘密を伝え、 T4 GPUが欲しいと言うと、 10:13.110 --> 10:18.600 コードを使ってサーバーを設定する。 10:18.780 --> 10:23.910 そして今、 これはローカルで実行する何かを書いているかのような単なる関数である。 10:23.940 --> 10:32.820 というのも、 私のマシンには、 このようなラマ・モデルをローカルで動かせるほどの馬力はないからだ。 10:32.820 --> 10:37.170 リャマCPのようなものに詳しい人ならできる方法もあるだろうけど、 ここに書いてあるようなことは僕にはできないし、 10:37.170 --> 10:41.040 やったとしてもとてもとても時間がかかる。 10:41.280 --> 10:48.010 それで、 T4 GPUを搭載したボックスでそれをやりたいんだ。 10:48.400 --> 10:51.430 ええと、 それで、 このコードはすべて、 あなたにとって非常に見慣れたものに見えるはずです。 10:51.430 --> 10:53.620 これがあなたが知っているコンフィグだ。 10:53.620 --> 10:59.800 つまり、 4ビットの量子化をラマに指定することになる。 11:00.160 --> 11:05.320 ええと、 トークナイザーをロードします。 11:05.320 --> 11:08.440 さて、 モデルをロードしよう。 11:08.440 --> 11:17.110 そして、 入力としてプロンプトをトークンにエンコードする。 11:17.140 --> 11:20.560 その警告を受けないように、 このアテンションマスクを設定した。 11:20.650 --> 11:23.380 そして、 モデル・ドット・ジェネレーションを行う。 11:23.380 --> 11:25.000 インプットを渡す。 11:25.000 --> 11:31.810 新しいトークンは5つだけで、 返事は1つでいいとする。 11:31.810 --> 11:36.520 私たちはその1つのレスポンスを受け取り、 それを解読して返す。 11:36.550 --> 11:38.470 簡単なことだ。 11:38.530 --> 11:43.900 では、 それを実行してみよう。 11:44.130 --> 11:47.100 だから、 いろいろなことが起きている。 11:47.100 --> 11:52.200 それで、 まず最初に、 僕は実際に何を走ったんだ? 11:52.200 --> 12:02.070 リモート関数を呼び出したわけだが、 ラマモデルに渡したプロンプトの内容は謎だ。 12:02.070 --> 12:04.260 誰もが独り立ちしなければならない。 12:04.290 --> 12:13.110 今聞いたところでは、 ええと、 ええと、 願わくば、 ほとんどの人がそこから次に何が起こるかを知っていてほしい。 12:13.110 --> 12:15.360 そうでなければ、 私はとても年を取ったように感じるだろう。 12:15.570 --> 12:23.040 ええと、 でも、 ええと、 これはもちろん、 マドンナの『Like a Prayer』のオープニングからそのままなんだけど。 12:23.040 --> 12:26.760 そして、 次は私の名前を呼ぶと聞いている。 12:26.790 --> 12:29.310 それを言わないのは、 ほとんど耐え難いことだ。 12:29.460 --> 12:33.750 あー、 今日一日、 頭の中でこの歌が鳴りっぱなしだ。 12:33.870 --> 12:35.040 あ、 でも、 あの。 12:35.040 --> 12:35.310 そうだね。 12:35.340 --> 12:40.410 そして、 もし僕がそれをいつまでも君の頭の中に置いていたら申し訳ないんだけど、 でも、 とてもキャッチーな曲なんだ。 12:40.440 --> 12:45.220 とにかく、 今我々が見ているのは、 あの箱の上で何が起こっているかということだ。 12:45.370 --> 12:49.240 そして、 モーダルそのものに切り替えることもできる。 12:49.420 --> 12:55.330 ええと、 ええと、 この画面をリフレッシュさせてください。 12:56.890 --> 12:59.290 つまり、 デプロイされたアプリではないんだ。 13:04.270 --> 13:05.350 儚いアプリ。 13:05.350 --> 13:06.340 そういうことだ。 13:06.550 --> 13:08.620 ちょっと待ってください。 13:08.710 --> 13:09.730 それでこれだ。 13:09.730 --> 13:11.050 今走っている。 13:11.080 --> 13:17.650 エフェメラルなアプリとして動いている。 13:17.650 --> 13:22.570 クリックすると、 ステータスが実行中であることがわかる。 13:22.990 --> 13:26.380 それと、 他に何が手に入るかな? 13:26.590 --> 13:29.680 だから、 コンテナはライブなんだ。 13:31.990 --> 13:35.230 メモリやCPUコアを見ることができる。 13:39.220 --> 13:42.960 そして、 我々が指定した通り、 T4 GPUであることがわかる。 13:43.620 --> 13:52.740 そして、 "ハロー "を見ることもできる。 PYは今走ったこのボックスにもある。 13:52.740 --> 13:59.730 そしてラマ。 さっき書いたPythonスクリプトが置いてある。 14:00.390 --> 14:03.330 ええと、 それではどうぞ。 14:03.360 --> 14:07.770 ここにいる間に指摘しておきたいのは、 ここの一番上にあるのは秘密だということだ。 14:07.770 --> 14:12.540 そしてシークレットはもちろん、 シークレットをセットする場所である。 14:12.540 --> 14:14.160 だから、 そうする必要がある。 14:14.310 --> 14:18.210 ハグしている顔の形見の秘密がバレないように、 今はそれをクリックするつもりはない。 14:18.270 --> 14:24.570 でもそこで、 このエフェメラル・サービスにデプロイされたコードで、 14:24.570 --> 14:30.240 ハグする顔のトークンを使えるようにするんだ。 14:30.840 --> 14:32.310 だからまだ動いている。 14:32.310 --> 14:35.550 この時点で、 私はこのビデオに固執すると思う。 14:35.550 --> 14:39.420 で、 戻ってきたら、 ああ、 もう成功したって書いてある。 14:39.630 --> 14:43.690 ええと、 ちょうど終了したというメッセージも受け取ったところだ。 14:43.840 --> 14:45.280 ええと、 それで...。 14:45.280 --> 14:45.880 見てみよう。 14:45.910 --> 14:46.180 そうだ。 14:46.180 --> 14:47.320 ここに戻る。 14:48.400 --> 14:49.870 何が出てくるか見てみよう。 14:49.900 --> 14:52.330 私の名前を呼ぶ声が聞こえる。 14:52.390 --> 15:01.420 ええと、 だから、 ラマ、 4ビット量子化バージョンのラマも、 マドンナの曲を完成させないわけにはいかなかったんだ。 15:01.690 --> 15:07.360 ええと、 それで、 このコードを実行することに成功しました。 15:07.600 --> 15:22.900 このエフェメラルな、 あー、 モーダルなサービスを使って、 あー、 量子化されたラマ、 あー、 モデル、 あー、 ラマ3を走らせる。 15:22.900 --> 15:22.900 プロンプトを完成させるモデル1名。 15:23.200 --> 15:24.070 分かった。 15:24.070 --> 15:30.100 また戻ってきたら、 モデルをデプロイして、 前回構築した独自モデルの周りにAPIをどのように配置するか、 15:30.100 --> 15:37.870 実際にやって見よう。 15:38.110 --> 15:39.550 すぐに会おう。