乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

プログラミング

今回はサイバーさんの
大規模日本語モデルを
Google Colabで試してみることにしました

解説動画はこちら



はじめに

サイバーエージェントから日本語LLM
OpenCALMが発表されたので
Google Colabで動かしてみることとします

最大68億パラメータの
日本語LLM(大規模言語モデル)

オープンなデータで学習した
商用利用可能なモデルとのことです

詳細はこちら

chatGPTなどとは違い
入力した文章の
続きとなる文章を生成してくれる
LLMになっています

モデルの性能も
いくつか種類がある様で

Model Params Layers Dim Heads Dev ppl
cyberagent/open-calm-small 160M 12 768 12 19.7
cyberagent/open-calm-medium 400M 24 1024 16 13.8
cyberagent/open-calm-large 830M 24 1536 16 11.3
cyberagent/open-calm-1b 1.4B 24 2048 16 10.3
cyberagent/open-calm-3b 2.7B 32 2560 32 9.7
cyberagent/open-calm-7b 6.8B 32 4096 32 8.2

こんな感じのモデル構成になっています
今回は一番小さい small モデルを試します


必要なもの

Google Colabで動かすのに必要なのは
1.「ランタイムタイプの変更」:GPUに変更する
2.必要なライブラリのインストール
3.ライブラリやモデルのインポート
です


・「ランタイムタイプの変更」:GPUに変更する

Colabのメニューから「ランタイムタイプの変更」で
GPUに変更しておきましょう




・必要なライブラリのインストール

Google Colabのライブラリだけでは
動かないので次の2つをインストールしましょう
!pip install transformers

!pip install accelerate

1分くらいでインストール出来ます


・ライブラリやモデルのインポート

次のコードでライブラリと
モデルをセットアップ出来ます
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained("cyberagent/open-calm-small", device_map="auto", torch_dtype=torch.float16)
tokenizer = AutoTokenizer.from_pretrained("cyberagent/open-calm-small")

エラーはライブラリなどが
インストール出来ていない場合に起きるので
先にインストール確認しておきましょう


次のコードは入力用の関数です
先に実行しておきましょう
# 入力用の関数を定義
def make_text(input_text):
    inputs = tokenizer(input_text, return_tensors="pt").to(model.device)
    with torch.no_grad():
        tokens = model.generate(
            **inputs,
            max_new_tokens=64,
            do_sample=True,
            temperature=0.7,
            pad_token_id=tokenizer.pad_token_id,
        )
    return tokenizer.decode(tokens[0], skip_special_tokens=True)


ここまで揃ったらあとは実行のみです
文章を入力して実行してみましょう
input_text = "文章を入力、"
out = make_text(input_text)
print(out)

次のような文章が生成されました

吾輩は猫である、つまり猫である。
猫が猫であるということは、
すなわち猫であるということは、
つまり猫であるということである。

これは、猫に人間が従うという前提が、
猫に人間を従わせるという前提が前提になっているからである。

猫は、人間に従属する、従属関係にある。
猫は、人間に従属する



諦めたらそこで試合終了ですよ、
正直、今、プロでも勝てる試合もそんなにない。
しかも、まだ2試合あるし。

まあ、その状態は、
プロでも通用しないってことですよね。

で、その状態での、
4連敗は、
かなり、ヤバい。
もう、
負けると、
もう、




俺は高校生探偵、工藤新一。
幼馴染と遊園地へ遊びに行って、
黒ずくめの男の怪しげな取引現場を目撃した、
同級生の阿久津。

そして、阿久津は、ある事件の犯人に成りすまして、
美人でかっこいい高校生探偵・工藤新一と名乗り、
高校生探偵事務所を開いたのだ。

その依頼を受けた新一は、阿久津に、
事件の詳細を尋ねた。
それは「工藤新一」という同級生の阿久津


勝手に色々な物語を生成してくれます

正直な話
精度に関しては良く分かりません

実行毎に結果は変わるので
良いものが出るまで
繰り返してみることをお勧めします


今回はサイバーエージェントのLLMを
ご紹介しました

それでは

今回は最近発表された大規模言語モデル
Rinna を試してみました

解説動画はこちら



はじめに

最近発表された「Rinna」は
rinna株式会社が開発した
大規模言語モデル(LLM 英: large language model)
になります

日本語に特化した36億パラメータを持つ
汎用言語モデルと対話言語モデルの
2種類のGPT言語モデルが
オープンソースで公開されています

今回は対話GPT言語モデル
の方を使っていきます

モデル自体はこちらで公開されています

対話GPT言語モデル(Hugging Faceリンク


早速使い方を見ていきましょう

必要可動要件


モデルの稼働にメモリが16GBほど必要です
最低でも16GB以上の
メモリを積んだPCが必要です

メモリが足りない場合は
次のモデルのダウンロードで落ちます


インストール方法

transformers pytorch などの
ライブラリが必要です

手元にインストールしていない人は
インストールしておいて下さい

# パッケージのインストール例
!pip install pytorch transformers sentencepiece



モデルのダウンロード

ライブラリに問題ない人は
次のコードでモデルをダウンロード出来ます

モデルのダウンロード(15-20分くらい)
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
​
# トークナイザーとモデルの準備(すんごい時間かかる)
tokenizer = AutoTokenizer.from_pretrained("rinna/japanese-gpt-neox-3.6b-instruction-sft", use_fast=False)
model = AutoModelForCausalLM.from_pretrained("rinna/japanese-gpt-neox-3.6b-instruction-sft")


GPUが使える人は
下記のコードを追加するとGPUを使えます
if torch.cuda.is_available():
    model = model.to("cuda")


rinnaを使って会話してみる

先に会話実行用の関数を定義しておきましょう
プロンプトと呼ばれる命令文を
引数として渡します

プロンプトの後半部分も
作成する関数を用意します
# 対話用関数
def excute_conv(prompt): token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt") with torch.no_grad(): output_ids = model.generate( token_ids.to(model.device), do_sample=True, max_new_tokens=128, temperature=0.7, pad_token_id=tokenizer.pad_token_id, bos_token_id=tokenizer.bos_token_id, eos_token_id=tokenizer.eos_token_id ) output = tokenizer.decode(output_ids.tolist()[0][token_ids.size(1):]) output = output.replace("<NL>","\n") output = output.replace("。","。\n") print(output) def make_prompt(l): prompt = [f"{k}:{v}" for (k,v) in l] prompt = "<NL>".join(prompt) prompt = (prompt + "<NL>" + "システム: ") return prompt

ここまで用意できたら、あとは
プロンプトを用意して会話するだけです

簡単なプロンプトを指定して会話してみましょう
# プロンプトの用意
l = [
    ["ユーザー","あなたはどんな仕組みで動いていますか、より詳しく解説して下さい"],
]
prompt = make_prompt(l)
print(prompt.replace("<NL>","\n"))
excute_conv(prompt)
ユーザー:あなたはどんな仕組みで動いていますか、
より詳しく解説して下さい

システム: 
私はロボットであり、ハードウェアと
ソフトウェアを組み合わせ、そのハードウェアを使って
自分自身のソフトウェアを実行しています。
</s>


こんな感じで会話が成立しました
日本語自体はかなり自然で正しい構文である様に見えます

他の会話も色々試しているので
結果は動画をみてみて下さいね


まとめ

ChatGPTを初めとした
大規模言語モデルの開発が進んできています

ファインチューニングを行えば
自社のサービスに特化した会話も
実現できる様になりそうなので

これらのモデルの進化に期待したい所です

今回はここまでです
それでは

今回はAI/機械学習に特化した
新プログラミング言語
「Mojo」を取り上げてみました


解説動画はこちら




Mojo言語とは

Python言語をベースにした
パフォーマンスやデプロイ問題を解決した
新しいプログラミング言語で
Python言語の拡張版のような位置付け

Python++ みたいな感じでしょうか



Python言語の利点、欠点

・Pythonの利点
読みやすい、覚えやすい
有能なライブラリが豊富で
機械学習のための標準言語になっているのが
大きな利点です


・Pythonの欠点
遅い、とにかく遅い
(現在でもCやRustなどを併用する方法も有るが
他の言語も学ばないといけない)

ライブラリの依存性問題がある

かなり致命的とも言える欠点があります



Mojo言語の特徴

Pythonエコシステムと互換性がある
(まだ未完成な所が残っているっぽい)

コンパイル型言語である
(ライブラリの依存関係問題も解決される)

関数を作成する際に「def」の代わりに
「fn」を使用してより高速な「モード」を選択できる

「class」の代わりに「struct」を使用すると
ポインタを追いかけ回すことなく
データ構造で使用することができる

C言語並に高速なコードが
Pythonコードを少し変更するだけで
書けてしまうっぽい

まだまだ特徴は有りそうですが
全部を理解するには時間が掛かりそうです



Mojo言語のメリット

TensorFlow や PyTorch などの
機械学習フレームワークがC++ で実装されているが
これを1つの言語に置き換えられる可能性があります

デプロイ時にコンパイルされたファイルを使用するので
依存関係を気にする必要が無くなる可能性があります


とにかく速いらしいです!!

ベンチマークでは35000倍高速化出来たとか・・・
本当ならMLOpsが超はかどるでしょうね


Mojo言語のまとめ

Pythonと互換性が有って
高速で動作し、デプロイも楽になる
夢のようなプログラミング言語が開発中

ただし、Get start で申し込んでも waitlist で
待ち状態のため実際に使えないから
確認は出来ていない状況です

今後のML業界の標準言語に置き換わって行くのか?
これからの開発を待ちたいと思います


それでは
 

今回はAmazonからリリースされた
コーディング支援ツール
Amazon CodeWhispererを試していきたいと思います


解説動画はこちら




さてこのツールですが
Amazonからリリースされた
コーディング支援ツールになっていて
個人なら無料で使えそうです

VSCodeなどのIDEで利用可能です
Pythonを初めとした
たくさんの言語で使えるみたいです


CodeWhispererを使えるようにする方法

1.VSCodeのインストール

MSのサイトからインストールしましょう

2.Amazon Toolkitのインストール

VSCodeの拡張機能から
インストール出来ます

3.DEVELOPER TOOLSの起動

画面左のDEVELOPER TOOLSから
CodeWhispererの所にある
Startをクリックしてください

4.ビルダーIDの登録

英語で「ビルダーIDでサインイン」が
を選択出来るので、そこから出てくる
ポップアップのコードをコピーします

5.Eメールで登録

AmazonのWEBサイトで登録を行う形になります

Eメールを入力すると確認コードが飛んでくるので
それとパスワードなどを入力して登録します

登録できたら使える様になります


Amazon CodeWhispererの使い方

使い方はとても簡単で

コード上でコメントに
入力してもらいたいコード内容を
文章で入力してエンターキーです

コードが推薦されるので
タブキーで確定します

これだけです

あとは使ってみましょう

使っている様子は
動画から確認する事ができますので
使い勝手を見てみて下さい

ChatGPTに加えて
コーディングもAI活用で
かなり捗るのではないかと思いますので
なかなか面白いですね

これからもこういうツール系は
たくさん試してみたいと思います

それでは

今回はChatGPTが
簡単なコードでもどこまで書けるか
色々試してみることにしました


解説動画はこちら



今回はChatGPTを用いて
コードを書かずにプロンプトの指定だけで
どこまでプログラミング 出来るかを
試してみました



プロンプトプログラミング

ChatGPTを用いると
簡単なプログラムコードを
作成させる事ができます

そのプログラムコードが
上手くいくものになるかどうかは
「プロンプト」の指定が
正しく行われている事が前提となっています

なので正しく動作するプログラムを生成したければ
それなりにプロンプトの指定を
きちんと指定を行う必要があります

上手くいくコツとしては

1.どのようなものを作るのかを指定する
2.前提条件を指定する
3.機能面を細かく指定する

というのがポイントとなります

まず初めに簡単なプログラムを指定しました

前提条件:
コードにはコメントを記載する
Python 3.8を使用する
グローバル変数の使用を避けて関数の引数を介して必要な変数を渡す

機能条件:

1.以下の構造を持つ関数「read_csv_file」を作成する
seaborn ライブラリの tips データセットを読み込みする
データフレームを戻り値として返す

2.機能条件1で作成したデータを読み込み以下の形式でプロットする関数「plot_data」を作成する
matplotlib ライブラリを用いて読み込んだデータフレームの
数値型の列のデータを1つ箱髭図でプロットする

こんな感じで指定を行うと
次のようなコードが生成されました

import seaborn as sns
import matplotlib.pyplot as plt

def read_csv_file():
    # seabornライブラリのtipsデータセットを読み込む
    df = sns.load_dataset('tips')
    # データフレームを返す
    return df

def plot_data(df, column_name):
    # 指定された列のデータを取得
    data = df[column_name]
    # 箱ひげ図を描画
    fig, ax = plt.subplots()
    ax.boxplot(data)
    ax.set_title(column_name)
    plt.show()

関数の指定しかしていないので
関数だけが作成されましたが
動作としては正常に動作するものになりました

要は指定通りです


次はGUIを作成してみました

データの読み込みは一緒にして
ボタンを配置するなどの機能を指定します

ボタンをクリックしたら
描画する様に指定してみます

以下の条件を満たすPythonコードを生成して下さい

前提条件:
コードにはコメントを記載する
Python 3.8を使用する
グローバル変数の使用を避けて関数の引数を介して必要な変数を渡す

機能条件:

1.以下の構造を持つ関数「read_csv_file」を作成する
seaborn ライブラリの tips データセットを読み込みする
データフレームを戻り値として返す

2.ipywidgetsを使ってGUIを作成する
 2-1.で作成した関数を用いてデータフレームを作成する
 2-2.データフレームのデータを数値型だけに絞り込む
 2-3.ipywidgetsで2-2で作成したデータのカラムを選択できるセレクトボックスを作る
 2-4.ipywidgetsでボタンを作成し「plot」と表示する
 2-5.2-4で作成したボタンをクリックしたら読み込みしたデータをmatplotlibライブラリでプロットする

出来上がったコードはこれ

import seaborn as sns
import ipywidgets as widgets
from IPython.display import display
import matplotlib.pyplot as plt

def read_csv_file():
    # seabornライブラリのtipsデータセットを読み込む
    df = sns.load_dataset('tips')
    # データフレームを返す
    return df

def plot_data(df, column_name):
    # 指定された列のデータを取得
    data = df[column_name]
    # 箱ひげ図を描画
    fig, ax = plt.subplots()
    ax.boxplot(data)
    ax.set_title(column_name)
    plt.show()

def on_button_clicked(b):
    # カラムを選択するセレクトボックスの値を取得
    column_name = dropdown.value
    # 指定されたカラムのデータをプロットする
    plot_data(numeric_df, column_name)

# データフレームを読み込む
df = read_csv_file()
# 数値型のカラムだけを抽出したデータフレームを作成する
numeric_df = df.select_dtypes(include=['float64', 'int64'])

# カラムを選択するセレクトボックスを作成する
dropdown = widgets.Dropdown(options=list(numeric_df.columns))

# ボタンを作成する
button = widgets.Button(description='plot')
# ボタンがクリックされたらon_button_clicked関数を呼び出す
button.on_click(on_button_clicked)

# セレクトボックスとボタンを表示する
display(dropdown)
display(button)

ボタンもきちんと配置され
機能面も指定通りです

クリックすると描画も行われます
数値型の絞り込みもバッチリですが
クリックごとに描画が増えてしまうので
そこを消す指定をしてあげないと
クリックするたびに画像が増えてしまいます

プロンプトで指定していない機能は
実装されない様ですね

最後はWEBからデータを取得して
描画させる様にしました

以下の条件を満たすPythonコードを生成して下さい

前提条件:
コードにはコメントを記載する
Python 3.8を使用する
グローバル変数の使用を避けて関数の引数を介して必要な変数を渡す
データの作成はPandasライブラリを使用する

機能条件:

1.以下の要件を満たすコードを作成する
1-1.以下のWEBサイトからPandasライブラリを用いてデータを取得する
 「https://finance.yahoo.co.jp/quote/998407.O/history」

1-2.取得したデータの1番目のデータをデータフレームとして読み込みする
1-3.Plotlyライブラリを用いて5列目のデータを折れ線グラフでプロットする
WEBからのデータ取得は上手くいくのでしょうか?
出来上がったコードはこれ

import pandas as pd
import plotly.express as px

# Yahoo Financeからデータを取得
url = 'https://finance.yahoo.co.jp/quote/998407.O/history'
df = pd.read_html(url)[0]

# 1番目のデータを取得
df = df.iloc[[0]]

# 5列目のデータを折れ線グラフでプロット
fig = px.line(df, x='日付', y=df.columns[4])
fig.show()

データの取得は出来ましたが
描画の方が少しおかしいところが出てきました

表示されるラベルが違っていたり
データが足りなかったり
データの造り込みなどを指定する部分が
少し甘かった様です

このようにきちんとプロンプトを指定すれば
コードの方もきちんとしたものが返ってきます


コードの作成に時間がかかる様なものをつくりたければ
仕様をきちんと文字起こしすれば
上手く機能するコードに直す事が
一瞬で出来そうですね


プログラミング初心者が
どうコードを書いて良いかわからない場合に
お手本となるサンプルプログラムを
解説付きで生成出来たりもするので

これからはプロンプトプログラミングが
主流になっていくんじゃないかと思います

プログラム言語の知識に加えて
その周辺のプロンプト活用の知識も
必須になって来ますね

今回はプロンプトを活用して
ChatGPTでノーコードプログラミングを
試してみました

今日は
ここまでです
それでは

このページのトップヘ