Stable Diffusion Web UIにFooocusのスタイルを取り込む

FooocusというStable DiffusionのUIではスタイルを設定するだけで呪文が不要のシンプルなプロンプトでの画像生成が可能になっています。
そのスタイルをAUTOMATIC1111/Stable Diffusion Web UIに取り込めるようにしてみました。

いろいろ過程を書いてるので、最後まで読むのがめんどかったら、このstyles.csvをStable Diffusion Web UIのフォルダ直下に置くと読み込まれる。すでにスタイルを設定しているのであれば、既存データを追加しておく。
https://gist.github.com/kishida/9e062c8d3f57dc68e8270b8417feecea#file-styles-csv

Fooocusはrun.batを起動するだけでインストールができるお手軽UIなのだけど、すでにAUTOMATIC1111 web uiを使ってるので取り込みたかった。
Fooocusに関してはこちらの記事が詳しい。
【西川和久の不定期コラム】次世代Stable Diffusion(SDXL)をWindows上で一発で使用可能にする「Fooocus」 - PC Watch

そしてFooocusではスタイルを指定すると呪文プロンプトを自動設定してくれるのだけど、そのスタイル一覧がこのGoogle Sheetにまとめてある。
https://docs.google.com/spreadsheets/d/1AF5bd-fALxlu0lguZQiQVn1yZwxUiBJGyh2eyJJWl74/edit#gid=0

100番目くらいまではComfyUI用のPrompt Stylerから持ってきている。
そのあと現時点で187まで増えている。
https://github.com/twri/sdxl_prompt_styler/blob/main/sdxl_styles_sai.json

上記Google SheetをHTMLに保存して、ChatGPTにCSV抽出をお願いしてみた。

しかし何度も失敗して、悪いファイル名の見本みたいなものができあがった。どれが最終ファイルでしょうか!

このChatGPTの気持ちの変遷がおもしろく、最初は「以下のリンクからダウンロードできます」だった。

途中からはファイル名に「final」をつけ、「何か他にお手伝いできることがありましたら、お知らせください」というタスク完了の定型文を付けて逃げようとしている。

いろいろあって完成したけど、すごくほっとした感じがある。

ChatGPTは人間のタスクを遂行するようしつけられているので、なかなかタスク完了しないと早く終わらせたいと思うようになるし、やっと完了すると安心する、という心の動きのようなものが形作られる。

ということで、冒頭のCSVができたので、これをStable Diffusion Web UIのフォルダ直下に置けば読み込まれる。すでにスタイルを設定していたら、既存データを追加しておく。
https://gist.github.com/kishida/9e062c8d3f57dc68e8270b8417feeceahttps://gist.github.com/kishida/9e062c8d3f57dc68e8270b8417feecea#file-styles-csv

ChatGPTががんばったスクリプトはこちら。ただし、前後にゴミの行が入るので、それは手動で削除して。
https://gist.github.com/kishida/9e062c8d3f57dc68e8270b8417feecea#file-html2csv-py

そうするとスタイルが指定できるようになります。

「1 girl in street」をプロンプトに入力してスタイルを色々変えてみたものがこちら。

cinematic-default

sai-anime

Japanese Ink Drawing

papercraft-papercut shadow box

いい感じ。

ネットワークプログラミングの練習にインターネット自由協会の電子公告表示プログラムを作ろう

登さんがインターネット自由協会の電子公告をTELNETで公開されていました。
TELNETであれば簡単に内容を見れるので、誰でも見れることを目指すべき電子公告には適していますね!

登さんがこういうツイートをされていました。

TELNETを使う理由のひとつに次のようなことがあげられています。

HTTP を用いて電子公告を公開していると、外国人の意志ひとつで、突然日本人の電子公告を閲覧者が事 実上閲覧できない状態になってしまうリスクがあります。他方、TELNET プロトコルは、接続先のインターネットサーバーに閲覧者がアクセスするとサーバーから送付されてくる文字を単に画面上に表示するだけの、これ以上に単純化することができない程度に最も基礎的なプロトコルであることから、外国人の意志によっても、決してその挙動が変更されない安定性があります

そう、アクセスすれば送られてくるメッセージを表示するだけです。
これはネットワークプログラムの練習にいいのでは、ということでインターネット自由協会の電子公告を表示するコードを書いてみます。

import java.awt.Font;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import javax.swing.*;

void main() throws IOException {
    var f = new JFrame("インターネット自由協会");
    f.setLocation(300, 300);
    f.setSize(800, 600);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    var t = new JTextArea();
    t.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));
    f.add(new JScrollPane(t));
    f.setVisible(true);

    try(var s = new Socket("koukoku.shadan.open.ad.jp", 23);
        var in = s.getInputStream();
        var r = new InputStreamReader(in, "Windows-31J"))
    {
        for (char ch; (ch = (char) r.read()) != 0;) {
            t.append(ch + "");
        }
    }
}

ウィンドウを表示したりいろいろとありますが、接続後の処理は受け取った文字を表示するだけになっています。

        for (char ch; (ch = (char) r.read()) != 0;) {
            t.append(ch + "");
        }

実行するとこうなります。

みんな自分の手元の言語でインターネット自由協会の電子公告を表示するコードを書くといいんじゃなかろうか。

ところでブログのヘッダー画像をStable Diffusion XLで生成するようにしたのだけど、結構いいのが出ててボツにするのが惜しいものが多いので、ここで供養しておきます。

ChatGPTで構成された仮想のソフトウェア会社にシステム開発を行ってもらうChatDevがおもしろい

ChatGPTによるメンバーで構成された仮想のソフトウェア会社にシステム開発を行ってもらうChatDEVが結構おもしろかった。

ChatDEVは、ChatGPTによってCTOやプログラマー、レビュアー、テスターといった役割をもつエージェントをやりとりさせることでソフトウェア開発を自動化しようという試みの実装です。
https://github.com/OpenBMB/ChatDev

イデアは論文にまとまっていて、こちらで概要が翻訳されています。
[LLM 論文]アプリ全自動開発"ChatDev"の日本語訳|すめらぎ

使い方としては、とりあえずClone

git clone https://github.com/OpenBMB/ChatDev.git

そして依存モジュールのインストール

cd ChatDev
pip3 install -r requirements.txt

あと、OpenAIのアクセスキーを環境変数OPENAI_API_KEYに設定しておく必要があります。

export OPENAI_API_KEY="your_OpenAI_API_key"

で、タスクと名前を指定すれば勝手にプログラムができる。

python3 run.py --task "[description_of_your_idea]" --name "[project_name]"

ということで、インベーダーゲームを作ってとやってみました。ここでは英語で指示してるけど、受け取るのはChatGPTなので日本語でも大丈夫です。あと、モデルはデフォルトでGPT-3.5-Turboなのだけど、確実さをもとめてGPT_4を使ったりしています。

python3 run.py --task "design invader game" --name "my-invader" --model GPT_4

ところでこの仮想開発会社、開発がはじまると確認なく最後まで進んで、できましたと納品したあとは修正も受け付けないという、分類するならクソ開発会社なので、タスクはこんな漠然としたものではなく具体的にキャラクタの形状や動作などを指定するほうがいいです。じゃないとなぜかへんなおっさんが・・・

で終わったらWareHouseフォルダのなかのアプリケーション名で始まるフォルダにいってmain.pyを起動すればOK

cd WareHouse/my-invader_DefaultOrganization_20230901092058
python main.py

ということで、まずGPT3.5-turboでやったのがこれ。
10分かかったのを20倍速にしてます。で、できたぞと思ったら・・・

へんなおっさんが横移動してミサイル置いていくアプリになっていましたw

課金は$0.16でした。25円くらい。

気を取り直してGPT4を指定したのだけど、最初はファイルひとつまるごと実装もれしていて、やりなおしたら動きそうなコードができていました。
画像ファイルがなかったので、Windowsのペイントで書いています。あと、ミサイルが動かないのを修正したり、実行速度を調整したりして、こんな感じに。

課金はやりなおし含めて$1.5増えていたので、200円かかっていますね。

実行ログを可視化することもできます。次のコマンドでビュワーを開いて、Chat Replayでログをアップロードすればいろいろ再現されます。

python3 online_log/app.py

こんな感じ。最初にCTOがデザインしてプログラマにタスクが渡り、レビュワーにレビューしてもらって、動くようになったらテスターがテスト、最後にドキュメントを書いて左側でソファに座ってるクライアントに納品という流れ。

まあ、実際には、ふつうにChatGPTに直接指示して作っていくほうが確実だし変なものになりづらいのだけど、これはコンセプトモデルなので、途中に人間が確認するフェーズを入れるとか、仮想環境をたててテスト起動をするとかいろいろ作りこめば、プログラム知らない人でもある程度のモノが作れる感じだなーと思いました。

この本には、LangChainによるエージェントでいろいろタスクを実現するデモまで載ってるけど、それの発展形という感じですね。

100年前の小学5年生がひらがなばかりの作文を書くのはおかしいのか

100年前(大正12年)の小学5年生の作文がひらがなばかりなのを見て、幼稚園じゃないんだから漢字かけるだろというのがあったので、当時の漢字教育どんなんだったんだろと調べてみたら面白かった。

まず、文化庁の「国語問題要領」の「国語問題の歴史的展望」を見ると、常用漢字表の発表がちょうど100年前なので、100年前の小学5年生は常用漢字をもとにした漢字教育を受けてないことがわかる。ちなみに、この常用漢字関東大震災のため実施できなかった。

明治35年(1902)文部省に国語調査委員会を設けて,この問題の解決に着手した。さらに大正10年(1921)には臨時国語調査会を設け,12年(1923)に常用漢字表,14年(1925)に仮名遣改定案を発表した。
https://www.bunka.go.jp/kokugo_nihongo/sisaku/joho/joho/kakuki/01/tosin01/03.html

なので、あまり漢字の学習できてないのではと書いてたら、「明治の教科書にも漢字があったのだから、大正12年の小学生は読み書きできたはず」という指摘を教科書アーカイブのリンク付きでもらった。

で「明治19年5月「教科用図書検定条例」以降の教科書検定制度による教科書」を確認してみる。
https://www.nier.go.jp/library/textbooks/K120.html

こんな感じ。これは尋常小学校用国語読本の巻8
https://nieropac.nier.go.jp/lib/database/KINDAI/EG00013529/?lang=0&mode=1&opkey=R169339370269797&idx=16&codeno=&fc_val=

文体がいろいろあって面白い。

確かに漢字がたくさんあるのだけど、無遠慮に漢字がのっていて、逆に「これほんとに読み書きできたのか?」という疑問。漢字をまとめたところもないので、これで漢字を覚えれるようにも思えない。

読めるからと言って書けるわけではない、というの、最近手書きをやってないぼくたち体験してるはず。

では別の教科書にあるかもと「書き方手本」を見る
https://nieropac.nier.go.jp/lib/database/KINDAI/EG00011665/?lang=0&mode=1&opkey=R169339432145629&idx=9&codeno=&fc_val=

こんな感じで、固有名詞が多いので、体系的に漢字を学習できていたようには見えないので、日常の文で漢字があまり使えず、ところどころ使えるものを使うという感じになってたのも無理はないなと思った。

で、先ほどの「国語問題の歴史的展望」に漢字廃止論が出てくることを思い出す。

慶応2年(1866)に前島密(ひそか)が建白した漢字御廃止之(の)議が最初であり,これが動機となってローマ字論やかな専用論が現れ,明治16年(1883)にはかなのくわいが作られた。

漢字難しすぎて学習の妨げになっているので廃止しようという話。明治の教科書で漢字が使いまくられてるの見ると、確かにそういう気持ちになるのわかる。

そして、廃止は難しいので節減論が出る。

現実の問題として実行が困難であるという理由から,別に漢字節減論が現れたのも明治初期のことである

それで常用漢字表の策定につながったと考えると、明治の教科書に漢字がたくさん載っているからといって、漢字を習得できたとは言い難いという気持ちになった。

そんなところで「カタカナばかりになるんでは?」という指摘があったので調べると、大正10年(1921年)の教科書では小1ではカタカナのみ、小2からひらがなと漢字が出てくるらしい。

大正10年の小学生が使用していた教科書は『尋常小学国語読本』。
巻一・二(小学1年生):カタカナのみ
巻三~十二(小学2~6年生):カタカナ、ひらがな、漢字
https://crd.ndl.go.jp/reference/modules/d3ndlcrdentry/index.php?page=ref_view&id=1000199346

ということで尋常小学国語読本の巻1を見るとカタカナばかり。

https://nieropac.nier.go.jp/lib/database/KINDAI/EG00013522/?lang=0&mode=1&opkey=R169339499044208&idx=9&codeno=&fc_val=

つまり、ひらがなというのは上級生が習うものということなので、小学5年生でひらがなばかりの文が書けるというのは、当時としては学習が進んでる扱いだった可能性がある。

ということで、100年前の小学5年生がひらがなばかりの作文を書くというのはおかしいというのは難しそう。

あと、「この時期には書き言葉と話し言葉が違ったはず」という指摘もあったけど、書き言葉と話し言葉を一致させる言文一致運動はすでに確立していたらしく、話し言葉で書かれていても不思議ではないです。

1900~10年の言文一致会の活動によって,運動は一応の確立をみた。
https://kotobank.jp/word/%E8%A8%80%E6%96%87%E4%B8%80%E8%87%B4%E9%81%8B%E5%8B%95-61054

この本、結構この内容がまとまってそうなので読んでみる。

ChatGPTに時計を作ってもらったら完璧だった

Macで時計を表示しようと思って、ウィジェットというのがあるなと表示してみたら常時表示はできなくて、じゃあJavaで作るかーと、とりあえずChatGPTで雛形つくってもらおうと思ったら欲しいものが完璧にできあがってしまった。

とりあえずGPT4に「Javaでアナログ時計を作って」というと、針だけの時計を作ってくれました。

「1分ごとの点を描いて」といって点を打ってもらう。

見づらいので、「5分おきに強調したい」といって強調してもらう。

そして「ウィンドウのタイトルバーを消せる?」といって、タイトルバー消してもらう。

ウィンドウの移動ができなくなるので、「時計の面をドラッグしてウィンドウを移動できる?」といってドラッグ可能にする。
このとき、importが足りなくてコンパイルエラーが出たので「importが足りない?」といって追記してもらう。

完成!というと絵文字つけて返事してくれました!

リスナーだったものをアダプターにして、ちょっと整理したものがこれ。ロジックは無変更です。
https://gist.github.com/kishida/c495ea132ffac387dd4815ba9d3ca991

ログはこれ。動きおかしいといってるのは、こちらのコピペミスで、そのあと同一のコードを提示してきています。
https://chat.openai.com/share/408d3986-667d-4100-bc75-3eeb6eed9a71

なんか、よくある小物は完全にChatGPTが作ってくれるので、「片手間につくる」みたいなのはほんとコード書く必要なくなってますね・・・

Code Llamaのinstructを試す

Llama2をコーディング用にチューニングしたCode Llamaでてますね。
そして、対話モデルもあります。

けどどう使うかわからなかったのでいろいろ試したら、なんとなくわかったのでメモ。
モデルはHugging Faceにあるので、ふつうのTransformersモデルとして使えます。
で、指示文は[INST][/INST]で囲む、システムからの出力は<SYS>から</SYS>で囲まれるという感じぽい。 ので、プロンプトをこんな感じで作る。

prompt = f"""[INST]{prompt}[/INST]
<SYS>

コード全体はこうなります。

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from colorama import Fore, Back, Style, init

model_name = "codellama/CodeLlama-7b-Instruct-hf"
model = AutoModelForCausalLM.from_pretrained(
    model_name, torch_dtype=torch.float16).cuda()
tokenizer = AutoTokenizer.from_pretrained(model_name)

prompt = """please write Java hello world
"""

prompt = f"""[INST]{prompt}[/INST]
<SYS>
"""

inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
with torch.no_grad():
    tokens = model.generate(
        **inputs,
        max_new_tokens=100,
        do_sample=True,
        temperature=0.8,
        pad_token_id=tokenizer.pad_token_id,
        eos_token_id=tokenizer.eos_token_id,
    )
    
output = tokenizer.decode(tokens[0], skip_special_tokens=True)
print(f"{Fore.YELLOW}{prompt}{Fore.WHITE}{output[len(prompt):]}")

VRAMは15GBくらい使います。
出力はこんな感じ。JavaHello world、仕様が新しすぎんか?

Stability AIの日本語画像言語モデルをWindows+RTX 4060 Ti 16GBで試す

Stability AIから日本語画像モデルが出ていたので試してみました。
Windows + RTX 4060 Ti 16GBです。

Stability AIのリリースはこちら
日本語画像言語モデル「Japanese InstructBLIP Alpha」をリリースしました — Stability AI Japan

モデルはこれ。
stabilityai/japanese-instructblip-alpha · Hugging Face

動かすとこんな感じで、5秒くらいで返答が生成されていました。結構ちゃんと画像を説明しています。

Google Colab(要課金)で動かすノートブックをからあげさんが公開されています。 https://zenn.dev/karaage0703/articles/8e1da482fbf1d0

基本的に、Hugging Faceにあるサンプルコードをベースに試していきます。
16bit floatだとメモリがギリギリあふれて激遅だったので、8bitで読み込んでいます。

ということでbitsandbytesが必要になるのだけど、pipで普通には入れれないので、text-generation-webuiで使ってるものを利用します。
https://github.com/jllllll/bitsandbytes-windows-webui

こんなコマンド

> python -m pip install bitsandbytes --prefer-binary --extra-index-url=https://jllllll.github.io/bitsandbytes-windows-webui

そして、モデル読み込み時にload_in_8bitTrueに。

model_name = "stabilityai/japanese-instructblip-alpha"
model = AutoModelForVision2Seq.from_pretrained(model_name,load_in_8bit=True, trust_remote_code=True)

モデルのデバイス設定は不要でエラーになるのでコメントアウト

#model.to(device)

generate時にpad_token_idがどうのこうのという警告が出るのでpad_token_id=tokenizer.pad_token_id,を付けくわえています。

  outputs = model.generate(
    **inputs.to(device, dtype=model.dtype),
    num_beams=5,
    max_new_tokens=32,
    min_length=1,
    pad_token_id=tokenizer.pad_token_id,
  )

GradioでのUIをつけたソースはこちら
https://gist.github.com/kishida/11f09fe9f8494be30070c016b4837ae7

あと、なにやらProtocol Buffersでバージョン違いがあるということで、実行前に環境変数の設定が必要でした。

> Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python

GPUメモリは12GBちょい使ってます。ブラウザなどで3GB弱つかっていたので、10GBくらい?

モデル読み込みは12GB RAMのGPUでもいけそうだけど、応答生成時に2GBくらいメモリ使うので、結構ギリギリになるかも。

りんごマークがちょっと見えるだけで「ラップトップコンピューター」って言ってるのはびっくり。

ということで、みんな4060 Ti 16GB買っておうちで動かそう。
中古の3090(24GB)と同じ値段だけど、3090は電源に強いのが必要になってめんどい。