My Free Software Activities in Feb 2024

2月のハイライトはhinawa-utilsがらみの調整をしたこと。 あとは64 bit time_tがらみの問題の影響調査をしたりもした。

DebGPT+text-generation-webuiでVRAM少ないGPUでテキスト生成AIに入門してみる方法(2024年2月時点)

本記事はDebGPTをきっかけにテキスト生成AIを試してみようと思った人のための記事です。

2024/02/17(土)のDebian勉強会(オンライン開催)の内容をきっかけにこの記事は執筆されました。

はじめに

Debian勉強会で、野首さんにより「RAGとLLM そしてDebGPT」というセミナーがありました。

DebGPTというツールが公開されています。主にDebianのリソース(BTS, buildd等)を参照し、OpenAI APIを経由したChatGPTによる要約、説明といったことが可能です。また、Mistral AI社の公開しているローカル向けLLMにも対応しています。 このツールを実際にローカルで動作させてみるまでのステップや、 内部の挙動の解説、そしてtext-generation-webuiというツールを介して他のLLMを使う手順などを紹介します。

当日の資料は RAGとLLM そしてDebGPTとして公開されています。

いわゆる生成AI系はVRAMを大量に積んだGPUを使っている人のためのものという印象が強かったので、 興味がひかれるものの、これまで手をだすことはありませんでした。

現在利用しているPCではGTX 1660なので搭載しているVRAMは6GBと、PCでゲームをしない用途では十分ですが、生成AIを活用するには不向きです。

やれGTX3090がいいとか札束で殴ることで解決できる世界ではありますが、そもそも手持ちのGPUを刷新しようにも、 電源の都合で補助電源8pin x 1の制約があるので、それほど強力なGPUはそもそも積めません。 (補助電源8pin x 1だとRadeonだとRX7600あたりまで、NVIDIAならGTX 3070 or GTX4060あたりまでのはず。)

それでも、最近は混合メモリ方式により、搭載VRAMがすくなくても動作させられるという話を聞いたので試してみることにしました。

環境構築をする

本記事では、Debian sid with GTX 1660で環境構築する前提とします。 他の環境では適宜読み替えてください。

  • nvidia-driverのインストール (525.147.05-7)
  • text-generation-webuiのセットアップ
  • LLMのダウンロード
  • DebGPTをインストールする

nvidia-driverのインストール

残念なことに、GPUをフルに活かすには、自由なnouveauドライバではなくプロプライエタリnvidia-driverを使ったほうが都合がよさそうなので、 nvidia-driverをインストールしておきます。

$ sudo apt install -y nvidia-driver

すると、nouveauドライバを利用しないように設定がなされます。

$ cat /etc/modprobe.d/nvidia-blacklists-nouveau.conf
# You need to run "update-initramfs -u" after editing this file.

# see #580894
blacklist nouveau

再起動するとnvidia-driverが使われるようになっているはずです。

nouveauドライバとnvidia driverのパフォーマンスについてはいくつか参考資料があります。 ちょっと古いとはいえまだまだ結構な差をつけられているようです。

text-generation-webuiのセットアップ

テキスト生成AIをWebUI経由で簡単に利用するために、text-generation-webuiのセットアップを行います。

$ git clone https://github.com/oobabooga/text-generation-webui.git
$ cd text-generation-webui.git
$ ./start_linux.sh

途中で環境に関して聞かれるので、適宜選択します。 この過程で依存ライブラリ等がもりっとダウンロードされます。

What is your GPU?

A) NVIDIA
B) AMD (Linux/MacOS only. Requires ROCm SDK 5.6 on Linux)
C) Apple M Series
D) Intel Arc (IPEX)
N) None (I want to run models in CPU mode)

Input> A

Do you want to use CUDA 11.8 instead of 12.1? Only choose this option if your GPU is very old (Kepler or older).
For RTX and GTX series GPUs, say "N". If unsure, say "N".

Input (Y/N)> N

GTX1660なのでTuring世代だから12.1系のCUDAが利用できるはずなので、Nを選択します。

これでinstall_files配下に必要なランタイム等がインストールされます。

もろもろセットアップが終わったら、再度次のようにして./start_linux.shを実行します。

$ ./start_linux.sh --api --listen --api-port 5000

すると、Web UIは http://localhost:7860 でアクセスでき、生成AIのAPIhttp://localhost:5000/v1 としてアクセスできるようになります。

LLMのダウンロード

LLMを動作させるために、モデルがないとどうしようもないので必要なファイルをダウンロードします。

  • http://localhost:7860 にアクセスする
  • Modelタブをクリックする
  • Download model or LoRAに「TheBloke/Mistral-7B-Instruct-v0.2-GGUF」を入力する
  • File name (for GGUF models)に「mistral-7b-instruct-v0.2.Q5_K_M.gguf」を入力する
  • Downloadをクリックする

上記により、必要なGGUFファイルがmodels/配下にダウンロードされます。

mistral-7b-instruct-v0.2.Q5_K_M.gguf はサイズが大きいものの、品質低下が少ないということで おすすめとされているモデルです。

速度をとるか、品質をとるかでいくつか異なるモデルが提供されています。

モデルがダウンロードできたら、リフレッシュボタンをクリックするとダウンロードしたモデルが選択できるようになります。 .ggufファイルを選択するとModel loaderにllama.cppが選択されます。

Model loaderにはいくつか挙動をコントロールするためのパラメータがあります。

  • n-gpu-layers: GPUを活用するならこの値を増やします。ただしGTX1660(VRAM: 6GB)では9が上限のようです。
  • n_batch: バッチ処理する単位を増やして高速化するならこの値を増やします。ただし、GTX1660ではそれほど増やせず530あたりが上限のようです。
  • tensorcores: tensor coreを活用するならチェックを有効にします。

ModelのLoadボタンをクリックするとモデルがロードされます。 メモリが足りていなかったり、パラメータが不適切だとあっさり例外を吐きます。

問題なくロードできたら、Chatタブでwho are you?とか入力してみると、応答が返ってくるはずです。

DebGPTをインストールする

生成AIをAPI経由で叩けるようになったはずなので、次はDebGPTのインストールを行います。

DebGPTはまだtrixie以降でないとパッケージがないため、あえてDebGPT向けのPythonの分離環境をあらかじめ用意したうえで、リポジトリソースコードを利用します。 あらかじめpyenvが利用できる前提とします。

$ pyenv install 3.12.2
$ pyenv virtualenv 3.12.2 py312-debgpt
$ pyenv local py312-debgpt
$ git clone https://salsa.debian.org/deeplearning-team/debgpt.git
$ cd debgpt
$ pip3 install .

debgptをインストールしたら、設定ファイルを生成します。

$ debgpt genconfig > $HOME/.debgpt/config.toml

次にconfig.tomlのopenai_base_urlを書き換えます。これは先程の text-generation-webuiを利用してローカルで動かしている生成AIのAPIサーバーを参照するための設定です。

#openai_base_url = 'https://api.openai.com/v1'
openai_base_url = 'http://localhost:5000/v1'

DebGPTを使ってみる

README.mdに記述されている、メーリングリストの内容を要約してみましょう。

$ debgpt -HQ --html 'https://lists.debian.org/debian-project/2023/12/msg00029.html' -A :summary

-HQでプロンプトを表示せず、レスポンスを受け取ったら終了するようにします。

[20:14:52] OpenAIFrontend> Starting conversation 19d6f92e-51f9-427d-9955-8267380e3892                                         frontend.py:66
LLM[2]> Mo Zhou has created a new project repo for DebGPT, a Debian-specific LLM (Large Language Model),
at <https://salsa.debian.org/deeplearning-team/debgpt>.
The project does not require expensive hardware or training, and Zhou plans to wrap debian-specific prompts with an existing chatting LLM.
However, Zhou is uncertain about the performance of smaller LLMs in this case and their quantization to int8 or int4 for laptops.
The dependencies needed by the project are not complete in the Debian archive. Zhou invites interested people to discuss the project in the repo issues.

元のHTMLの内容が以下の通りなので、情報欠落しているとはいえ、それっぽく要約してくれるとはいえそうです。

On 12/30/23 21:40, Mo Zhou wrote:

> >   I am not
> >   able to develop DebGPT and confess I am not investing my time in
> >   learning to do it.  But can we attract the people who want to tinker in
> >   this direction?

> Debian funds should be able to cover the hardware requirement and training expenses even if they are slightly expensive. The more expensive thing is the time of domain experts. I can train such a model but clearly I do not have bandwidth for that.

No. I changed my mind.

I can actually quickly wrap some debian-specific prompts with an existing chatting LLM. This is easy and does not need expensive hardware (although it may still require 1~2 GPUs with 24GB memory for inference), nor any training procedure.
The project repo is created here https://salsa.debian.org/deeplearning-team/debgpt
I have enabled issues. And maybe people interested in this can redirect the detailed discussions to the repo issues.
I'm sure it is already possible to let LLM read the long policy document, or debhelper man pages for us, and provide some suggestions or patches. The things I'm uncertain is (1) how well a smaller LLM, like 7B or 13B ones can do compared to proprietary LLMs in this case; (2) how well a smaller LLM can be when it is quantized to int8 or even int4 for laptops.
Oh, BTW, the dependencies needed by the project are not complete in debian archive. 

さいごに

DebGPT+text-generation-webuiでVRAM少ないGPUでテキスト生成AIに入門してみる方法(2024年2月時点)を紹介しました。

ひとまず英語で試してみましたが、次は日本語で応答を返せるようにしてみたいところです。

この記事はUltimate Hacking Keyboard v2で執筆しました。

My Free Software Activities in Jan 2024

1月はConoHa VPSのv3にどうDebianをインストールするかというのをDebian勉強会で発表した。 また、CollectdのLuaプラグインへの機能追加をマージされるところまで実施したというのが成果。

ConoHa VPS (v3)にDebianをインストールする方法(2024年1月時点)

本記事はConoHa VPS (v3)でDebianインスタンスを立てようとおもったら、標準イメージにDebianがなくて切ない思いをしたひとのための記事です。

2024/01/20(土)のDebian勉強会(オンライン開催)にて、本記事の内容を発表予定です。 debianjp.connpass.com

はじめに

ConoHa VPSには従来のv2に加えて、v3という異なるインフラのサービス群が昨年追加されました。 v2では標準イメージとしてDebianを選択することができましたが、v3では標準イメージとしてUbuntuは選択できるもののDebianはありません。 OpenBSDとかNetBSDとかFreeBSDはあるのに。

しかし、各種APIは提供されているのでそれを使えばなんとかなりそうです。

なお、ご利用ガイド CLIツールで簡単にISOイメージをマウントするはv2向けっぽいのでv3では利用できません。

ISOイメージをつかってインストールするには

公式ドキュメントにISOイメージを使ってインストールする方法が案内されています。

APIでVPSにISOイメージを挿入する

上記手順に従って作業すればDebianをインストールすることが可能です。やったね。

Debian bookworm 12.4.0のnetinst.isoあたりをダウンロードしてきて使うと良いでしょう。

カスタムISOを使ってインストールしたい

なお、Debian公式イメージを使ってインストールする場合、ConoHa 標準イメージを利用した場合のように次のことができません。

  • 初期構築の時点でsshの公開鍵認証を使う

パスワード認証でsshとかもうやりたくないですよね。最初から公開鍵認証にしたい。

カスタムISOイメージをつくる

ようは事前に公開鍵認証のための設定を仕込んでいけばよいわけです。

自動化のためのソリューションはいろいろあるようです。 お好きなものを選択するのが良いでしょう。

本記事では、preseed.cfgをCDイメージに含めて参照するfile preseedについて説明します。

前提条件は「1 core 512MBの最小スペックのDebianインスタンスを構築し、公開鍵認証でログインできるようにする」です。 インストール時には全部自動化まではできなくてもよいものとします。(きちんと作り込むのがちょっと面倒くさいので)

なお、初期イメージとしてUbuntu 22.04を選択すると最小スペックの512MBのインスタンスは使えません。Ubuntu 20.04を選択しましょう。

事前準備

まずは、CDイメージの中身をとりだしておきます。

sudo mount -o loop debian-12.4.0-amd64-netinst.iso /media/cdrom
sudo cp -r /media/cdrom rootfs
sudo chown $(USER):$(USER) -R rootfs
sudo umount /media/cdrom

あとはこれをcustom-isoとしてコピーしてそっちをいじります。

Graphical Installを無効化する

デフォルトではGUIインストーラーを起動しようとするのであらかじめ殺しておきます。512MBではテキストモードでのインストール一択です。

diff --git a/isolinux/menu.cfg b/isolinux/menu.cfg
index 2b89df3..f8e961a 100644
--- a/isolinux/menu.cfg
+++ b/isolinux/menu.cfg
@@ -3,7 +3,7 @@ menu width 70
 
 menu title Debian GNU/Linux installer menu (BIOS mode)
 include stdmenu.cfg
-include gtk.cfg
+#include gtk.cfg
 include txt.cfg
 menu begin advanced
     menu label ^Advanced options

テキストモードの選択と、リージョンなどの質問をスキップする

うっかり、他のモードでインストールが始まらないように、テキストモードをデフォルトにしておきます。

diff --git a/isolinux/txt.cfg b/isolinux/txt.cfg
old mode 100644
new mode 100755
index 4bec49c..794be48
--- a/isolinux/txt.cfg
+++ b/isolinux/txt.cfg
@@ -1,4 +1,5 @@
 label install
        menu label ^Install
+       menu default
        kernel /install.amd/vmlinuz
-       append vga=788 initrd=/install.amd/initrd.gz --- quiet 
+       append language=en country=US keymap=us file=/cdrom/preseed/preseed.cfg vga=788 initrd=/install.amd/initrd.gz --- quiet 

また、起動時のパラメーターでインストール中の言語やキーマップの選択をスキップできるようにします。

他の質問をスキップするために、file=/cdrom/preseed/preseed.cfgを読み込むように指示しておきましょう。 あとは、preseed.cfgがうまく作り込めていればテキストモードでの質問にいちいち答えなくてもいいわけです。

preseed.cfgで公開鍵認証を有効にする

# Setup public key
d-i preseed/late_command string \
  cp /cdrom/preseed/sshd_config.d.local /target/etc/ssh/sshd_config.d/local.conf ; \
  mkdir -p /target/home/debian/.ssh ; \
  cp /cdrom/preseed/authorized_keys /target/home/debian/.ssh/ ; \
  in-target chown debian:debian -R /home/debian/.ssh ; \
  in-target chmod 400 /home/debian/.ssh/authorized_keys

preseed.cfgの最後のあたりに上記のような設定を追加します。 あらかじめdebianユーザーがpreseed.cfgによって作成してあって、そのauthorized_keysを設定するという想定の記述例です。

sshdの設定もCDイメージに含めておけば、上記のようにして一緒に仕込んでおくこともできます。

CDのコンテンツのチェックサムを更新する

cd custom-iso; \
sudo chmod +w md5sum.txt; \
find -follow -type f ! -name md5sum.txt -print0 | xargs -0 md5sum > md5sum.txt; \
sudo chmod -w md5sum.txt

CDイメージに含めるファイルを書き換えているので、チェックサムを更新しておきます。

リマスタリングCD

sudo genisoimage -quiet -r -J -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o netinst.iso custom-iso

作業しているディレクトリがcustom-isoだとしたら、その親ディレクトリでコマンドを実行してnetinst.isoを生成します。 (-b-cオプションに指定しているisolinux/isolinux.binなどは親ディレクトリに存在していなくて支障ありません。)

さいごに

本記事は、ConoHa VPS (v3)で標準イメージとしてDebianが選択できるようになったら、役割を終える内容です。 賞味期限がたぶん短いはずなので試すならお早めに。(標準イメージとしてDebianが利用できるならわざわざこんなことしなくてもよいためです。)

この記事はUltimate Hacking Keyboard v2で執筆しました。

My Free Software Activities in Dec 2023

しばらく記事を書いていなかったか。

最近は11月はDebian勉強会で発表したり、年末のあんどきゅめんてっどでびあん2023年冬号の原稿を執筆したりしていた。 今月は地道にパッケージのメンテナンスをしていた。

今年はGitHubスポンサーで投げ銭してもらうというイベントもあった。たぶんDebianでのパッケージのメンテナンス活動が評価されたのだろう。 collectdに投げていたパッチがマージされたのもよかった。ただv6向けの作業などいくつか課題が残っている。

いいキーボード(Ultimate Hacking Keyboard v2)を入手できたので、そのUltimate Hacking Keyboard 60入門を執筆して頒布したりもした。 在庫が若干数なのでどこぞの誰かに刺さるとよい。UHK v2はお高めではあるものの、分割キーボードかつポインティングスティックがついているという意味で自分の印象としてはエンドゲームに近い。 あとはキースイッチとかキーキャップを揃えるという沼が待っているくらいだ。(自作キーボードの沼にはまだはまってはいない。)

来年は、もうちょっと精力的に活動できると良い。

My Free Software Activities in Aug 2023

先月は、パッケージのdouble build問題への対処やDMARCがらみのことを調べてまとめたりしたり、 メロンブックスさんで Ultimate Hacking Keyboard 60入門を頒布しはじめたりもした。在庫はあと2冊のはず。 物理本を欲しい方はそちらをどうぞ。 linux-firewire-utilsのレビューに協力をしたりもしている。

さくらのメールボックス利用者のためのDMARCポリシーの設定方法

さくらのメールボックスは、自分で独自ドメインのメールサーバーを運用まではしたくない人にとってはメールサービスだけ契約でき、費用もお手頃なのでとても助かっています。

rs.sakura.ad.jp

もし検討するなら、さくらのメールボックスの基本仕様を参照するのがおすすめです。

help.sakura.ad.jp

実際、過去にGandi.netがドメインに付随する無料メールボックスを廃止してしまったときは、さくらのメールボックスに乗り換えました。

kenhys.hatenablog.jp

さて、昨今ではメールをちゃんと送るためにはSPFやらDKIMの設定をしておくことが推奨されています。 ただし、さくらのメールボックスではDKIMは設定できません。

さくらのレンタルサーバに対するご要望はありませんか?
  • 投票数:123
  • コメント数 13

メールサーバーのDKIM対応

現在SPFには対応していますが、DKIMには対応していないので、迷惑メールに分類されないためにも対応を希望します。

sakura.uservoice.com

要望自体はあがっているものの、未対応です。

というわけで、DMARCポリシーでチェックさせるべきはSPFのみということになります。

そのため、独自ドメインのメールアカウントをさくらのメールボックスで運用する場合、次のようなTXTレコードを設定しておくのがおすすめです。

例えば、example.orgなメールアカウントを運用している場合、_dmarc.example.orgのTXTレコードに以下を設定します。

v=DMARC1; p=quarantine; fo=s; aspf=s; rua=mailto:dmarc-reports@example.org; ruf=mailto:dmarc-reports@example.org
項目 説明
p=quarantine 例えば、example.orgから受け取ったメールの認証に失敗したら、不審なメールとして扱うように依頼します。
fo=s SPFしかさくらのメールボックスでは設定できないので、SPFが失敗したら失敗レポートをrufで指定したアドレスへ送信するように依頼します。
aspf=s メールの送信元のドメインが厳密に一致していることをチェックします。例えばexample.orgサブドメインを詐称しているようなメールを受け付けない。
rua 集計レポートの送信先を指定する。
ruf 失敗レポートの送信先を指定する。要は詐称したもしくは設定ミスったメールが送られているようなら、受信したメールサーバーに教えてもらう。

ruaやrufとしてメールアドレスを公開することになるので、場合によってはそこへのSPAMが届くことが懸念されます。

通常はp=noneからはじめて、(設定不備により)不審なメールとして扱われないことをレポートから確認してから、徐々にp=quarantineもしくはp=rejectへと移行するのが推奨されています。 (しかし、そもそもレポートを送るようにちゃんと設定してあるメールサーバーがそれほど多くないという話もあるので、あんまりメリットないならレポートを受け取らない判断をしているところもあるのかもしれません。)

ただ、そのまま忘れていてp=noneかつrufやruaを設定せず運用していると、ドメインを詐称したメールを自分の関知しないところで送られてしまっているまま気づかない状態が続くことになるので、 p=noneにするなら、rufやruaを設定して観測できるようにしてから、早めに移行したほうがよいとは思います。

この記事はUHKv2で執筆しました。