スライド/ChatGPTを使った文書の学習システムをサーバーレスで作ってみる version 22

2023/05/26 16:17 by sinofseven
  :追加された部分   :削除された部分
(差分が大きい場合、文字単位では表示しません)
スライド/ChatGPTを使った文書の学習システムをサーバーレスで作ってみる
## 自己紹介
- 夏目 祐樹 (ナツメ ユウタ)
- クラスメソッド株式会社
  - CX事業本部 Delivery部
  - 自称 サーバーレスエンジニア
- 好きなAWSサービス
  - Lambda, DynamoDB, SQS, Glue
- 最近やってるゲーム
  - FF14 (極ゴルベーザ討滅戦、勝てない)
  - 崩壊スターレイル (均衡レベル5になったけど、育成素材が足りない)

## LlamaIndexについて (1)
- https://gpt-index.readthedocs.io/en/latest/
- LLMは大量の公開情報で学習されている
- LLMをプライベートデータで強化するためのFrameworkがLlamaIndex
- OpenAIのLLMを使用することもできる
- 既存のデータソースとデータ形式を取り込むためのコネクタ
- データ(インデックス、グラフ)を簡単に使用保存するための方法

## LlamaIndexについて (2)
![[9005514175731682] スクリーンショット 2023-05-26 14.29.42](https://mimemo.s3-ap-northeast-1.amazonaws.com/attachment/9614b200-81d6-4743-9712-2e2e35666fe8.png)

## 作りたいもの
- Developers IOの記事を収集する仕組みを作ったので、学習させる仕組みも実装したい

![[9005514175400231] luciferous-devio-index(1)](https://mimemo.s3-ap-northeast-1.amazonaws.com/attachment/e51613aa-ca9d-4f21-8ff2-7de038f39545.png)

## 完成してません

## 言い訳 (1)
- Developers IOの記事を約40,500件を仕組みとは別に学習させようとしてみた
- エラーが色々出てうまく動かなかった
  1. EC2上でしてみた -> 学習開始から3日後、文字列を解釈するライブラリでエラー
  1. GlueのPython Shell Jobでやってみた -> 学習開始から2日後、学習したデータをzip圧縮しようとしたらメモリ超過でエラー 
  1. GlueのPython Shell Jobでやってみた -> 学習開始の翌日、学習したデータをJSON化しようとしたらメモリ超過でエラー

## 言い訳 (2)
- 家のGaming PCにWSL2の環境を構築し、メモリ26GBを使えるようにして学習させた
  - 2日で学習は完了した
  - 完了したが吐き出されたデータは約6.5GBあった
- これをサーバーレスで扱うには色々考慮する必要がある

## どう学習させていくか
- Indexのファイルを維持する
  - GlueのPython Shell Job (もともと使う予定だったやつ)
  - Fargate
- Indexのファイルを諦める
  - ローカル以外の場所をLlamaIndexのストレージとして利用する

## GlueのPython Shell Job
- AWSのサーバーレスなコンピュートリソースの一つ
- Glue JobではPython Shell Jobの他にSpark Jobもある
- 計算能力は1DPUもしくは0.0625DPU (1/4 DPU)
  - 1DPU = 4つのvCPUと16GBのメモリ
- Python Shell JobではPython3.6かPython 3.9のどちらかを使用できる
- タイムアウトは多分青天井
  - 100年を設定してみたら何故かJob DetailのUpdateができてしまった
    - なんで?

## Python Shell Jobで使えるライブラリ
- ある程度のライブラリははじめからインストールされている
- Python 3.9
  - ライブラリセット: 分析 (一部抜粋)
    - `awscli==1.23.5`, `botocore==1.23.5`, `boto3==1.22.5`, `awswrangler==2.15.1`, `pandas==1.4.2`
  - ライブラリセット: なし (ここに書いたライブラリのみ)
    - `awscli==1.23.5`, `botocore==1.23.5`

## Python Shell Jobでライブラリを追加したい場合
- `--additional-python-modules`というJobパラメータを追加すれば実行時にインストールしてくれる
- 例)  
  ```
  --additional-python-modules boto3==1.26.133 botocore==1.29.133 awscli==1.27.133 llama-index==0.6.6
  ```

## Python Shell Jobに独自のコードを追加したい場合 (1)
- 外部ライブラリの他に、自分で書いた複数のコードを使いたいことはよくある
- `.whl`ファイルとしてパッケージングしてS3 Bucketに保存し、Jobパラメータ `—extra-py-files`にS3 URIを記述してあげれば使える

## Python Shell Jobに独自のコードを追加したい場合 (2)
公式のドキュメントに書いてある方法
![[9005514170306939] スクリーンショット 2023-05-26 16.00.03](https://mimemo.s3-ap-northeast-1.amazonaws.com/attachment/96cd970c-b949-40bc-9d5e-0426c30806bf.png)

## Python Shell Jobに独自のコードを追加したい場合 (3)
![[9005514170190088] スクリーンショット 2023-05-26 16.02.17](https://mimemo.s3-ap-northeast-1.amazonaws.com/attachment/611d0f1d-2425-4d05-90e3-19f5e3ee870e.png)![[9005514170190088] スクリーンショット 2023-05-26 16.02.17](https://mimemo.s3-ap-northeast-1.amazonaws.com/attachment/611d0f1d-2425-4d05-90e3-19f5e3ee870e.png)

## Python Shell Jobに独自のコードを追加したい場合 (4)
- setup.pyを書くのはちょっと面倒
  - 依存ライブラリはどう書くの?
- ということで自分はpoetryというPythonのツールを使った

## poetryって何?
- pythonのパッケージ管理ツール
- pipenvとほぼ同等の機能を持つ
- pipenvとは異なり、パッケージのbuildやpublishもできる

## poetryでPythonのパッケージを作る (1)
依存ライブラリとして`llama-index==0.6.11`を追加する。

```
$ poetry new test_package --src
$ cd test-package
$ poetry add llama-index==0.6.11
$ echo << EOS >> src/test_package/__init__.py
>def test():
>    print('test')
>EOS
$ poetry build
```

## poetryでPythonのパッケージを作る (2)
```
$ find . | sort
.
./README.md
./dist
./dist/test_package-0.1.0-py3-none-any.whl
./dist/test_package-0.1.0.tar.gz
./poetry.lock
./pyproject.toml
./src
./src/test_package
./src/test_package/__init__.py
./tests
./tests/__init__.py
```      

自己紹介

  • 夏目 祐樹 (ナツメ ユウタ)
  • クラスメソッド株式会社
    • CX事業本部 Delivery部
    • 自称 サーバーレスエンジニア
  • 好きなAWSサービス
    • Lambda, DynamoDB, SQS, Glue
  • 最近やってるゲーム
    • FF14 (極ゴルベーザ討滅戦、勝てない)
    • 崩壊スターレイル (均衡レベル5になったけど、育成素材が足りない)

LlamaIndexについて (1)

  • https://gpt-index.readthedocs.io/en/latest/
  • LLMは大量の公開情報で学習されている
  • LLMをプライベートデータで強化するためのFrameworkがLlamaIndex
  • OpenAIのLLMを使用することもできる
  • 既存のデータソースとデータ形式を取り込むためのコネクタ
  • データ(インデックス、グラフ)を簡単に使用保存するための方法

LlamaIndexについて (2)

[9005514175731682] スクリーンショット 2023-05-26 14.29.42

作りたいもの

  • Developers IOの記事を収集する仕組みを作ったので、学習させる仕組みも実装したい

[9005514175400231] luciferous-devio-index(1)

完成してません

言い訳 (1)

  • Developers IOの記事を約40,500件を仕組みとは別に学習させようとしてみた
  • エラーが色々出てうまく動かなかった
    1. EC2上でしてみた -> 学習開始から3日後、文字列を解釈するライブラリでエラー
    2. GlueのPython Shell Jobでやってみた -> 学習開始から2日後、学習したデータをzip圧縮しようとしたらメモリ超過でエラー
    3. GlueのPython Shell Jobでやってみた -> 学習開始の翌日、学習したデータをJSON化しようとしたらメモリ超過でエラー

言い訳 (2)

  • 家のGaming PCにWSL2の環境を構築し、メモリ26GBを使えるようにして学習させた
    • 2日で学習は完了した
    • 完了したが吐き出されたデータは約6.5GBあった
  • これをサーバーレスで扱うには色々考慮する必要がある

どう学習させていくか

  • Indexのファイルを維持する
    • GlueのPython Shell Job (もともと使う予定だったやつ)
    • Fargate
  • Indexのファイルを諦める
    • ローカル以外の場所をLlamaIndexのストレージとして利用する

GlueのPython Shell Job

  • AWSのサーバーレスなコンピュートリソースの一つ
  • Glue JobではPython Shell Jobの他にSpark Jobもある
  • 計算能力は1DPUもしくは0.0625DPU (1/4 DPU)
    • 1DPU = 4つのvCPUと16GBのメモリ
  • Python Shell JobではPython3.6かPython 3.9のどちらかを使用できる
  • タイムアウトは多分青天井
    • 100年を設定してみたら何故かJob DetailのUpdateができてしまった
      • なんで?

Python Shell Jobで使えるライブラリ

  • ある程度のライブラリははじめからインストールされている
  • Python 3.9
    • ライブラリセット: 分析 (一部抜粋)
      • awscli==1.23.5, botocore==1.23.5, boto3==1.22.5, awswrangler==2.15.1, pandas==1.4.2
    • ライブラリセット: なし (ここに書いたライブラリのみ)
      • awscli==1.23.5, botocore==1.23.5

Python Shell Jobでライブラリを追加したい場合

  • --additional-python-modulesというJobパラメータを追加すれば実行時にインストールしてくれる
  • 例)
    --additional-python-modules boto3==1.26.133 botocore==1.29.133 awscli==1.27.133 llama-index==0.6.6
    

Python Shell Jobに独自のコードを追加したい場合 (1)

  • 外部ライブラリの他に、自分で書いた複数のコードを使いたいことはよくある
  • .whlファイルとしてパッケージングしてS3 Bucketに保存し、Jobパラメータ —extra-py-filesにS3 URIを記述してあげれば使える

Python Shell Jobに独自のコードを追加したい場合 (2)

公式のドキュメントに書いてある方法
[9005514170306939] スクリーンショット 2023-05-26 16.00.03

Python Shell Jobに独自のコードを追加したい場合 (3)

[9005514170190088] スクリーンショット 2023-05-26 16.02.17

Python Shell Jobに独自のコードを追加したい場合 (4)

  • setup.pyを書くのはちょっと面倒
    • 依存ライブラリはどう書くの?
  • ということで自分はpoetryというPythonのツールを使った

poetryって何?

  • pythonのパッケージ管理ツール
  • pipenvとほぼ同等の機能を持つ
  • pipenvとは異なり、パッケージのbuildやpublishもできる

poetryでPythonのパッケージを作る (1)

依存ライブラリとしてllama-index==0.6.11を追加する。

$ poetry new test_package --src
$ cd test-package
$ poetry add llama-index==0.6.11
$ echo << EOS >> src/test_package/__init__.py
>def test():
>    print('test')
>EOS
$ poetry build

poetryでPythonのパッケージを作る (2)

$ find . | sort
.
./README.md
./dist
./dist/test_package-0.1.0-py3-none-any.whl
./dist/test_package-0.1.0.tar.gz
./poetry.lock
./pyproject.toml
./src
./src/test_package
./src/test_package/__init__.py
./tests
./tests/__init__.py