19日に更新してた

枯れ木も山の賑わい

GTX1060 6G にて FlexGen の opt-1.3b を text-generation-webui で動かした話

最近話題の ChatGPT を超えるとか言われている FlexGen。

いろいろと検索してみたら、こちらのサイトで FlexGen の windows でのインストールや使用法について詳しく書かれておりました。

economylife.net

まぁ、win11、i7、memory 32G、GTX1060 6G ではお話にならないはずなのですが、動いたら儲けもので opt-1.3b のベンチマークを上記サイトに従ってやってみたら、以下のような感じでベンチマークが出る。

model size: 2.443 GB	cache size: 0.398 GB	hidden size (p): 0.008 GB
peak gpu mem: 3.240 GB	projected: False
prefill latency: 2.654 s	prefill throughput: 771.604 token/s
decode latency: 2.384 s	decode throughput: 52.003 token/s
total latency: 5.039 s	total throughput: 25.403 token/s
model size: 2.443 GB	cache size: 0.398 GB	hidden size (p): 0.008 GB
peak gpu mem: 3.240 GB	projected: False
prefill latency: 2.663 s	prefill throughput: 769.197 token/s
decode latency: 2.363 s	decode throughput: 52.468 token/s
total latency: 5.026 s	total throughput: 25.468 token/s

じゃ、どこのサイトでも試しているチャットを動かしてみようとしたら、上記のページには動かしたよって書いてある chatbot.py がダウンロードしたファイルの中に入ってない。
公式に行ってみたら、なんで消したのかと言い合っているのでそういうものらしいと諦めて、FlexGen をアンインストールの後、オススメされていた text-generation-webui を公式サイトを参照してインストールする。

github.com

Installation option 2 に書かれている通りに

  1. windows 用をダウンロードして展開
  2. install.bat をクリックしてインストール
  3. download-model.batをクリックしてから opt-1.3b を選んで学習ファイルをダウンロード

してから、その後、サイトにあるように

github.com

text-generation-webui のフォルダに移動して

python convert-to-flexgen.py models/opt-1.3b/

を実行してファイルを変換してから、元のフォルダに戻って、start-webui.bat をクリックして起動。表示される local url に接続します。

Starting the web UI...
Warning: chat mode currently becomes somewhat slower with text streaming on.
Consider starting the web UI with the --no-stream option.

Loading the extension "gallery"... Ok.
Loading opt-1.3b...
Auto-assiging --gpu-memory 5 for your GPU to try to prevent out-of-memory errors.
You can manually set other values.
Loaded the model in 5.09 seconds.
Running on local URL:  http://127.0.0.1:7860

To create a public link, set `share=True` in `launch()`.

と出て、一応動いているらしいことがわかります。

text-generation-webui はこんな感じ、使うところだけ撮ってみました。

サクサク動きます。お返事もすぐ帰ってくる感じです。こちらの英語が最大のネックです。

動いたことに気を良くして、opt-2.7b も opt-6.7b も動かしてみたけれど text-generation-webui なら動いています。ベンチマークは両方とも当然のようにメモリーが足りなくて動きませんでしたから、上の起動時の表記にあるメモリー使用量調整を自動でつけてくれる恩恵ですね。
速度的には opt-2.7b だとチャットできる感じですが、opt-6.7bだと text-generation-webui 起動に1分位かかり、動き始めるとなんとかチャットができる感じでしょうか。質問内容やタイミングによってはかなり時間がかかります。

むこうは英語しか通じない & こちらは英語がヘボいの相乗効果で聞いている内容がショボかっただろうけれども、GPU の使用率は opt-6.7b で一瞬最大100%位、それ以外だと最大80%程度でなんとかなっていましたので、使用率は想像より高くなかったです。タスクマネージャーの GPU のコピー1が結構動いていたので割とまともに動いているんだろうな & 学習ファイルが大きくなると遅くなるけど饒舌になって賢くなる感じなので、GPUモリーがないと実用上お話にならないを体感しました。

日本語の単語は知っているみたいですが、日本語の会話にはならないです。opt-1.3b でこんな感じで opt-2.7 も opt-6.7 も似た感じ。


ロースペックな GPU で動かした話はあまりなかったのでネタとして。

python 3.8 から 3.10 へ乗り換えて selenium でちょっとハマった

python 3.8 を使っていたけれど、そろそろバージョンあげようかなと思っていたところに、AIコスプレとかキャッチーな記事を見て一回やってみるかと 3.10 に。

anaconda はライセンスがなんとかとか言っていた気もするので、サクッと消してマイクロソフトストアからダウンロードしてインストール。

必要なライブラリをインストールしてパス通して、さて既存の自作のが動くかなと試してみたら、対応する selenium が書式が変わっているらしく修正が必要。さて、修正したつもりも上手く動かない。

なんでだと思っていたら、引っ張ってくる内容が複数必要なところに

driver.find_element(By.XPATH,'//*[@id="station-list"]/li/*')

と書いておりまして、欲しかった結果を得るには

driver.find_elements(By.XPATH,'//*[@id="station-list"]/li/*')

とするべきでした。

driver.find_element ではなくて driver.find_elements

久しぶりですっかり忘れていました。

ちなみに、AI コスプレの stable diffusion は web ui で順調に動いております。*1

*1:i7, 32G, GTX1060 6Gで chilloutmix, 512x512の画像が約30秒でできてくるので暇つぶしには最適です。

python で xml のエンコードを自動認識にしてたら、utf-8 を windows-1254 と誤認識していた、理由はわからん。

win11 上の pythonxml を読み込んで検索してゴニョゴニョしていたら、検索されていないものがある。

もともとのデータにはあるのは確認しているので何が原因だと探していったら、表題。*1

import requests
import xml.etree.ElementTree as et

response = requests.get(f'http://hoge/fuga.xml')

response.encoding = response.apparent_encoding

et.fromstring(response.text)

としていたのを

import requests
import xml.etree.ElementTree as et

response = requests.get(f'http://hoge/fuga.xml')

response.encoding = "utf-8"

et.fromstring(response.text)

に変更して取りあえず動くようにしました。

3年位運用していてはじめてのケースで、一週穴開けました。

同じ発行元の同じような xml ファイルをいくつか読み込んでいたのですけれど、何故か一つだけ誤認識していました。なぜそのファイルだけ誤認識しているのかよくわからなかったのですけれど、とりあえず動くからよし!*2

*1:困ったときにはプリントデバグしかできない低機能な人間なので、どこまで動いているのかをプリントデバグして上で検索されていないのを確認して、typeで調べてみた。

*2:現場猫

agouti が chrome 110.0.5481.77(Official Build) (64 ビット)の headless mode で動かない模様【その後動作しました】

golang で作ったものがある日突然動かない。先週までうまく動いていたから、いろいろ調べてみたら表題でした。*1一応 chromedriver のバージョン。

D:\bin> chromedriver.exe -version
ChromeDriver 110.0.5481.77 (65ed616c6e8ee3fe0ad64fe83796c020644d42af-refs/branch-heads/5481@{#839})


とりあえず、"--headless" だけ外したら動いたので様子見。"--disable-gpu" は有効のままですが、一応動いてます。*2

options := agouti.ChromeOptions(
		"args", []string{
			// "--headless",
			"--user-data-dir=D:\\chromeuserprofile",
			"--disable-gpu", // 暫定的に必要らしいです。
		})

一瞬 chrome が立ち上がってパカパカしますが、動かないよりはいいので気にしないようにしております。

golangchromegoogle 謹製なんだからそのあたりもなんとかしておくれよ。

追記【2023/03/07】

developer.chrome.com

の記事を見て

options := agouti.ChromeOptions(
		"args", []string{
			"--headless=new",
			"--user-data-dir=D:\\chromeuserprofile",
		})

で動くんじゃないか?と試してみたら正解。無事解決。

google様、申し訳ございませんでした。m(_ _;)m

*1:python からリファクタリングしたもので、python のは全く問題なく動作しておりましたのでどこかがかんでいるのだろうと。

*2:ドライバーの問題と思いますので意味がないかもしれませんが、ブラウザが110.0.5481.78、110.0.5481.178でも同症状

JSON や XML を golang struct に変換してくれるサイト

年が明けて何かと忙しくて趣味に割く時間が取れないのでお茶を濁すような更新。

検索すると一ページ目に出てくるけれど、検索ワードを忘れて面倒なことも多いのでメモ代わりに。

JSON を変換してくれるサイト
mholt.github.io

追加
transform.tools



XML を変換してくれるサイト*1
xml-to-go.github.io

追加
jsonformatter.org

いちいち書かなくていいのでとても便利です。*2

トータルの作業量を考えたら仔細なことなのですが、string での時間表記が time.Time で書き出されてきたので、書き直さないとうまく動かなかったケースがあったのでご注意を。

あと、golang にはあまり関係ないですが、
httpbin.org
あたりも便利ですよね。

*1:以前のものは気がついたら繋がらなくなってますね。新しいところをリンクしておきますね。2023/02/27

*2:リンク切れしていたので、使いやすそうなところだけ追加しときました。xmljson も上の方だけ使ったことがあります。

既存のコードにちょっと手を加えて goroutines を使ってみた。

golang で書いた ffmpeg を使ったダウンローダーを goroutines で並行ダウンロードできるようにしてみました。

もともと、ffmpeg のオプションを array に入れて for 文で回していたので、その前に

var wg sync.WaitGroup
wg.Add(len(array))

と追記、ダウンロード処理部分は関数化して使っていたのをこんな感じで goroutines にして

go func(ffmpeg_command string) {
	defer wg.Done()
	download(ffmpeg_command)
}(ffmpeg_command)

最後に

wg.Wait()

を入れただけで、1分台前半から30秒かからないくらいのスピードになりました。*1

超簡単。python だと非同期処理とかよくわからないレベルの僕みたいな初心者でも、golang だと簡単に書ける。

*1:総ダウンロード数が片手で余るくらいなので wg.Add() に len(array) を突っ込んだのですが、サーバーの負荷を考えないといけませんね。

golang 2重? 2次元? 配列とかスライスとか

配列だと

package main
import "fmt"
func main(){
    a:=[3][]int{}
    a[0]=append(a[0],1)
    fmt.Println(a)
}
>>[[1] [] []]

という感じで、使える部分を零詰めして対応するなら、

package main
import "fmt"
func main(){
    l:=[3][3]int{}
    l[0][1]=1
    fmt.Println(l)
}
>>[[0 1 0] [0 0 0] [0 0 0]]

こんな感じで、スライスだと

package main
import "fmt"
func main(){
    s:=[][]int{}
    s=append(s,[]int{1})
    s[0]=append(s[0],2)
    fmt.Println(s)
}
>> [[1 2]]

こんな感じ。