DIVX テックブログ

catch-img

無料、初心者向け、所要時間30分。Google ColaboratoryとHugging Face、最初の一歩

はじめに

こんにちは。株式会社divx エンジニアの安部です。
ChatGPT等のAIチャットツール、Cursor等のAIを組み込んだ開発ツール、OpenAIのAPIを使ったサービス等、いよいよAIが開発現場や日常に深く潜り込んできましたね。
LLM(Large Language Model:大規模言語モデル)も一般教養として知っておきたい単語になってきています。多くの企業がLLMを公開しており、様々な学習データを簡単に試せるようになっています。
この記事は、これからAIシフトをする際に利用するかもしれない以下の2つのサービスに触れてもらうことを目的に書きました。

  1. Google Colaboratory
  2. Hugging Face

「LLM 使い方」などのワードで検索してみると、はっきりと「無料でできる範囲でLLMを使ってみよう」という記事が少ないです。
というのも、後述の通りLLMは「さらなる学習」を目的に利用されることが多いので、制約の多いGoogle Colaboratoryの無料版はあまり利用されません。
本記事は実務であまりプログラミングをしない方や駆け出しエンジニアの方でも触れるところまでを想定しています。お金も時間もかかりません。
この記事を「LLM入門編」として、興味が湧いた方は課金してファインチューニングを試してみてください。

大規模言語モデル(LLM)とは?

LLMの概要

LLM(Large Language Model:大規模言語モデル)とは、多くのデータをもとに訓練された人工知能(AI)の一種です。
AIを「プレーンな状態」→「訓練した状態」→「さらに訓練した状態」に分けるとわかりやすいです。
「プレーンな状態」では、特定のタスクを行う能力が高くなく、あまり役に立ちません。
「訓練した状態」では、大量のデータをもとに言語処理や画像生成を学ばせた状態になります。このとき、損失関数(予測値と実際の正解値のズレを計算する関数)の結果が最小になることを目指します。つまり、想定する正解に近づけていく作業です。LLMは、一般にこの状態で公開されています。

ファインチューニング

「さらに訓練した状態」はファインチューニングとも言われます。訓練した状態で公開されたLLMに対して、更に特定の領域の能力を伸ばすために独自に訓練する作業です。
たとえば、一般的な画像生成ができるモデルに対して、特定の作家の絵を大量に読み込ませることで「その作家っぽい絵柄に特化したAIモデル」を作ることができます。このようなファインチューニングは、公開済みのモデルを利用して個人が行うことが多いです。
今回は「訓練した状態」のAIモデルを無料で利用する方法を書きます。応用すればファインチューニングも行えますが、課金が必要になります。

事前知識

Google Colaboratoryとは?

Googleが提供する、ブラウザから直接Pythonを記述・実行できるサービスです。主な特徴は以下のとおりです。

  1. 環境構築が不要
  2. GPU に無料でアクセスできる
  3. 簡単に共有できる
    特に「GPU」についてはGPU RAM10-15GBのスペックのものを無料で利用できます。
    無料で使う場合の注意点は以下の通りです。
  4. 無料版ではGPU使用量の上限等でしばしば使えなくなる。(平均24時間程度で復帰します。)
  5. 操作しないまま90分放置すると環境がリセット
  6. インスタンス起動後12時間経つとリセット。

本格的に使いたい方は「Google Colab Pro」に月額1200円程度を課金すると、更にスペックが高く、永続的な利用が可能になります。
参考:Google Colaboratory

Hugging Faceとは?

機械学習、自然言語処理のモデルを共有するためのプラットフォームです。
AI版Githubみたいなものです。
今回使うモデルの使い方はいずれもHugging Faceのページを参照しています。
参考:Hugging Face – The AI community building the future.

Google Colaboratoryにノートブック追加

Google Colaboratoryのプロジェクト単位を「ノートブック」と呼びます。
まずはGoogle Driveに接続します。右上の「新規作成」→「その他」→「Google Colaboratory」を選択します。
「その他」からGoogle Colaboratoryを選択
Noteの名前はDriveアイコンの横の「Untitled」をクリックして変更します。
"Untitled"を任意のタイトルに変更
続いて、ランタイムタイプを変更します。今回はPythonを使い、画像生成のモデルも使いたいのでGPUを使います。設定は以下の通り。

  1. ランタイムのタイプ:Python 3
  2. ハードウェア アクセラレータ:T4 GPU
    ランタイムタイプを選択。
    Python3, T4 GPUを選択。

これで、Pythonコードを入力するだけで実行できます。

Pythonコードの実行
以上でノートブックの準備は完了です。

今回使用するAIモデル

Google Colaboratoryの無料版で利用できるマシンスペックだと、高性能なLLMは満足に動作しません。「LLM 軽量」などのワードで検索して出てくるモデルを試行錯誤で動かしていく必要があります。
以下は、私が試した範囲で動作したモデルです。

Stable Diffusion

画像生成系のメジャーなAIモデルです。
無料で簡単に画像生成ができます。
CompVis/stable-diffusion-v1-4 · Hugging Face

LINE DistilBERT Japanese

LINEが公開している自然言語処理のモデルです。今回は、マスクされた文章を予測するという使い方をしてみようと思います。
https://huggingface.co/line-corporation/line-distilbert-base-japanese

各モデルの使い方

おそらく、Python未経験の方やHugging Faceの説明の読み方がわからない方もいるかと思います。
ここも簡単で、Hugging Faceにアクセスして最初に出てくる"Model Card”の情報をChatGPTにコピペすると大まかな使い方を教えてくれます。

質問フォーマット

以下のREADMEを読み取って、Pythonで実行するコードを提案してください
ーーー
[ここにModel Cardのテキストをペースト]

ChatGPTの回答(要約)

このREADMEは、Stable Diffusion v1-4モデルに関する詳細な情報と、Pythonを使用してこのモデルを利用するための手順を提供しています。
(中略)
必要なライブラリのインストール
まず、必要なパッケージをインストールします。これには、diffuserstransformersscipyが含まれます。

pip install --upgrade diffusers transformers scipy

 PyTorchを使用してStable Diffusionを実行

以下のコードスニペットは、PyTorchを使用してStable Diffusionモデルを実行する方法を示しています。

import torch
from diffusers import StableDiffusionPipeline
model_id = "CompVis/stable-diffusion-v1-4"
device = "cuda" 
# (中略)

利用用途と注意点
モデルの利用は研究目的に限られ、以下のような用途が含まれます。
(中略)
これらのコードスニペットと説明を使用して、Stable DiffusionモデルをPythonで実行し、様々なテキスト入力から画像を生成することができます。

各ファイルを記述、格納

ファイルを新規作成

ファイルアイコンをクリックして新しいファイルを選択し、ファイル名を入力します。


作成するファイル名は以下のとおりです。

  1. line_distilbert_sentence_generator.py
    LINE DistilBERT Japaneseで日本語文章の穴埋め予測をするコードです。
  2. requirements.txt
    必要なパッケージを記述、一括でインストールできるようにするファイルです。
  3. sd_image_generator.py
    Stable Diffusionで画像生成するためのコードです。
  4. usage.txt
    コマンドの使い方、インポート方法等を記載したファイルです。

下記のフォルダ構成になっていればOKです。

各ファイルの記述

今回は繰り返し処理を想定して記述しています。各コードを読んで、必要に応じて書き換えてください。
コードの内容が分からない場合は、Hugging Faceの該当ページを参照して、ChatGPTも併用して読み解いていきましょう。
想定した動きになるよう、ChatGPTを用いてコードを加筆しています。
また、一定時間が経過するとすべてのファイルが消えますので、PCのローカルに用意して、バックアップしておくことをおすすめします。

sd_image_generator.py

import torch
import os
import shutil
from diffusers import StableDiffusionPipeline

model_id = "CompVis/stable-diffusion-v1-4"
device = "cuda" if torch.cuda.is_available() else "cpu"

# 開始処理
print("画像生成を開始する場合、 '1'を入力してください。")
continue_val = input()
folder_name = "sd_images"
os.makedirs(folder_name, exist_ok=True)

# 繰り返し処理
while continue_val == "1":
    # 取得するイメージのプロンプト入力を促す。
    print("どのような画像を生成しますか?(英語入力推奨)")
    kind_of_image = input()

    # パイプラインの作成
    pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16, revision="fp16")
    pipe = pipe.to(device)

    # パイプラインの実行
    generator = torch.Generator(device).manual_seed(42) # seedを前回と同じ42にする
    with torch.autocast(device):
        image = pipe(prompt=kind_of_image, guidance_scale=7.5, generator=generator).images[0]

    # 生成した画像の保存
    specialChars = "!#$%^&*()  "
    image_name = kind_of_image
    for specialChar in specialChars:
        image_name = image_name.replace(specialChar, '_')
    image.save(os.path.join(folder_name, f"{image_name}.png"))

    print("続ける場合は'1'を入力してください。")
    print("終了する場合は'1'以外を入力してください。")
    continue_val = input()

print("それでは!ありがとうございました!")

line_distilbert_sentence_generator.py

from transformers import AutoTokenizer, AutoModelForMaskedLM
import torch

# トークナイザーとモデルのロード
tokenizer = AutoTokenizer.from_pretrained("line-corporation/line-distilbert-base-japanese")

# 必要に応じてMasked Language Modeling用のモデルをロード
model = AutoModelForMaskedLM.from_pretrained("line-corporation/line-distilbert-base-japanese")

continue_val = "1"

while continue_val == "1":
  print("文章の穴埋め予測ができます。")
  print("予測してほしい文章の穴埋め部分より前を書いてください。")
  input1 = input()
  print("予測してほしい文章の穴埋め部分より後ろを書いてください。")
  input2 = input()
  sentence = input1 + "[MASK]" + input2
  print(sentence)
  inputs = tokenizer(sentence, return_tensors="pt")
  # token_type_idsを削除
  inputs.pop("token_type_ids", None)

  # モデルの出力を取得
  outputs = model(**inputs)

  # ログitsを取得(Masked Language Modelingではここから予測します)
  logits = outputs.logits

  # マスク位置のトークンIDを取得
  mask_token_index = torch.where(inputs["input_ids"] == tokenizer.mask_token_id)[1]

  # マスク位置のトークンに対応するログitsを取得し、最もスコアの高い単語を予測
  predicted_token_id = logits[0, mask_token_index].argmax(axis=-1)
  predicted_token = tokenizer.convert_ids_to_tokens(predicted_token_id)[0]  # 予測されたトークン

  print(f"予測されたトークン: {predicted_token}")
  print("続ける場合は'1'を入力してください。")
  print("終了する場合は'1'以外を入力してください。")
  continue_val = input()

print("それでは!ありがとうございました!")

requirements.txt

albumentations
diffusers
opencv-python
pudb
imageio
imageio-ffmpeg
pytorch-lightning
omegaconf
test-tube
streamlit
einops
torch-fidelity
kornia
-e git+https://github.com/CompVis/taming-transformers.git@master#egg=taming-transformers
-e git+https://github.com/openai/CLIP.git@main#egg=clip
invisible-watermark
accelerate
git+https://github.com/huggingface/transformers
ftfy
fugashi 
sentencepiece
unidic-lite

usage.txt

よく使うコマンド

python実行
import 実行したいPythonファイル名(拡張子を除く)
例: import sd_image_generator
2.各パッケージのインストール。実行後はランタイムの再起動を推奨。
import imp
!pip install -r requirements.txt
1のコマンドでPythonファイルが実行できない場合
import imp
imp.reload(実行したいPythonファイル名(拡張子を除く))
例: imp.reload(sd_image_generator)


実行

GUIの説明と実行時に便利なショートカットキー

「+コード」ボタンで次の行を追加してPythonコードを打ち込み、再生ボタンで実行します。

実行したコードを再度実行したい場合はGUI上の再生ボタンで実行できます。

また、ファイル名をクリックすると右側にファイルの内容が表示され、編集できます。エラー時にお試しください。


また、以下のコマンドを入力することでショートカットも可能です。

  1. cmd + Enter
    コードを実行
  2. Shift + Enter
    コードを実行し、次のコード入力行を追加。

必要なパッケージをインストール

最初に、必要なパッケージを以下のコマンドでインストールします。

import imp
!pip install --upgrade -r requirements.txt

下記のようにログが出てきて、結構時間がかかります。

インストールが終わると「RESTART RUNTIME」のアラートが出てきます。パッケージをインストールした後にはランタイムの再起動が必要です。
また、インストールするパッケージが多いので、中断する場合もあります。複数回実行しましょう。

Stable Diffusionで画像生成

パッケージがインストールできたら、Stable Diffusionに接続して画像を生成してみます。
以下のコマンドを打ちます。

import sd_image_generator

 打ち込むと「1を入力してください」という指示が出てくるのでキーボードの半角1を打ち込みます。
続いて英語で、生成したい画像のテーマを打ち込みます。初回は必要なパッケージを諸々インストールするので、画像生成も含めて3分程度かかります。
生成された画像は「sd_images」に保存されます。
下図のようにフォルダとファイルが確認できれば成功です。


上記スクリーンショットに写った画像は「Shibuya Halloween」と打ち込んで生成された画像です。
渋谷の町並みの中に、ハロウィンのかぼちゃ、ジャック・オー・ランタンのような人々が並んでいます。(ちょっと怖いので、スクリーンショット内でお楽しみください。)
Stable Diffusionの今回使ったモデルは、やや油絵的なタッチの画像が生成されることが多いようです。

LINE DistilBERT Japanese で日本語の穴埋め予測

これも上記と同様、以下のコマンドを実行して指示通りに進めていくと日本語の文章が生成されます。

import line_distilbert_sentence_generator

下記のようなログが出れば成功です。

上記のスクリーンショットでは、以下のように入力して結果を得ています。
「予測してほしい文章の穴埋め部分より前」入力内容:

人間とは考える

「予測してほしい文章の穴埋め部分より後」入力内容:

である。

結果:

人間とは考える[MASK]である
予測されたトークンである:_べき 

・・・意図した結果ではありませんでしたが、意味は通っています。
より訓練すれば精度は上がりそうですが、現時点でも日本語の意味として矛盾することはあまりありません。

二回目以降の挙動

実行を複数回行うと、キャッシュ等の理由で実行できないことがあります。
以下のコマンドで解決しましょう。

import imp
imp.reload(実行したいPythonファイル名(拡張子除く))

GPU制限時の挙動

なお、GPU制限等でNVIDIAのGPUドライバが見つからない等のエラーが出ることがあります。以下のコマンドを実行し、NVIDIAのGPUドライバがマウントされているか確認できます。

!nvidia-smi

GPUがマウントされている場合: 

GPUがマウントされていない(NVIDIAのドライバがない)場合: 

終わりに

今回は無料で使える範囲で、Google Colaboratoryの使い方、Hugging Faceの紹介をしてきました。
コードは複雑ですが、ChatGPTにエラーログを読ませることで実際に動くコードに近づいていきます。
これをきっかけに色々なLLMに触れることで、ファインチューニング等の発展的な学習につなげていただけますと幸いです。


お悩みご相談ください

  ご相談フォーム | 株式会社divx(ディブエックス) DIVXのご相談フォームページです。 株式会社divx(ディブエックス)


お気軽にご相談ください


ご不明な点はお気軽に
お問い合わせください

サービス資料や
お役立ち資料はこちら

DIVXブログ

テックブログ タグ一覧

人気記事ランキング

GoTopイメージ