My Free Software Activities in March 2024

3月は64bit time_tがらみを調べたのと、FTBFSの注意喚起のバグレポートを投げていた。 lists.debian.orgのカテゴリ分類を整理したいんだけど、これ誰が管理しているんだろうか。

How about allocating more buildd resource for armel and armhf?

This article is cross-posting from grow-your-ideas. This is just an idea.

salsa.debian.org

The problem

According to Developer Machines [1], current buildd machines are like this:

  • armel: 4 buildd (4 for arm64/armhf/armel)
  • armhf: 7 buildd (4 for arm64/armhf/armel and 3 for armhf only)

[1] https://db.debian.org/machines.cgi

In contrast to other buildd architectures, these instances are quite a few and it seems that it causes a shortage of buildd resourses. (e.g. during mass transition, give-back turn around time becomes longer and longer.)

Actual situation

As you know, during 64bit time_t transition, many packages should be built, but it seems that +b1 or +bN build becomes slower. (I've hit BD-Uninstalled some times because of missing dependency rebuild)

ref. https://qa.debian.org/dose/debcheck/unstable_main/index.html

Expected situation

Allocate more buildd resources for armel and armhf.

It is just an idea, but how about assigning some buildd as armel/armhf buildd?

Above buildd is used only for arm64 buildd currently.

Maybe there is some technical reason not suitable for armel/armhf buildd, but I don't know yet.

2024/03/24 UPDATE: arm-arm01,arm-arm03,arm-arm-04 has already assigned to armel/armhf buildd, so it is an invalid proposal. See https://buildd.debian.org/status/architecture.php?a=armhf&suite=sid&buildd=buildd_arm64-arm-arm-01, https://buildd.debian.org/status/architecture.php?a=armhf&suite=sid&buildd=buildd_arm64-arm-arm-03, https://buildd.debian.org/status/architecture.php?a=armhf&suite=sid&buildd=buildd_arm64-arm-arm-04

Additional information

  • arm64: 10 buildd (4 for arm64/armhf/armel, 6 for arm64 only)
  • amd64: 7 buildd (5 for amd64/i386 buildd)
  • riscv64: 9 buildd

TP-LinkのTX50EをLinuxで使う(2024/03時点)

以前、WiFi 6(11ax)USB WiFiアダプター(BUFFALO WI-U3-1200AX2)をLinuxで使う(2022/02時点)という記事を書きました。

あれから2年ほどが経過し、ある程度安定して使えているのだけれども、ちょっと気になる点がでてきました。

それは、継続的に大容量のファイルをダウンロードしているような場合に接続が切れてしまい、USB子機を刺し直すまで復帰できないことがあるということです。

そうそう頻繁に発生するわけではないが、踏むとかなり嫌な現象です。 USB接続ということで発熱を疑ってはみたものの、どうもそれとも違うようです。

なかにはDFSのせいでチャンネルが切り替わったという場合もあるので必ずしも無線LAN子機が悪いわけではありません。 しかし、遭遇すると面倒くさい。 そこで、試しに置き換えを検討することにしました。

My New Gearの選定条件について

以前は有線での配線が現実的でないことから、簡単に使えそうなUSB無線LAN子機としてBUFFALO WI-U3-1200AX2を選択しました。

しかし今では別にUSB接続にこだわる必要もありません。 というかむしろUSB無線LAN子機をやめようかと思っているのでいくつか検討してみました。 条件はつぎのとおりです。

  • WiFi 6 (11ax)対応は必須
  • WiFi 6Eまではいらない
  • USB接続の無線LAN子機は対象外とする
  • LinuxでドライバーがあるなどDebian sidで安定して使えそうなものにする
  • M.2への増設はスロットに空きがないので不可
  • WANは共用LANでそれほど速度はでないし、二重ルーターのWAN側は1Gbpsの制約があるので過剰スペックはいらない

結果として候補は次の2つとなりました。

TX20EとTX50Eでは、TX20Eが4000円くらい、TX50Eが5000円くらいの費用感でした。

現状WANがせいぜい300Mbps程度しかでない回線なので、TX20Eの5GHzで1201Mbpsという仕様でスペック的には十分です。

しかし、TX20EとTX50Eでは採用されているチップに違いがありました。

TX20EはRealtekのチップでRTL8852BE、一方TX50EのほうはIntelのAX200を採用しています。 WI-U3-1200AX2もRealtekだったので、今度はIntelのチップを採用しているTX50Eを選択することにしました。 (AX200だったら、M.2に刺すタイプがだいぶ安いのですが、M.2は空いていないので断念しました。)

TP-Linkはルーターだったら個人的な理由があって選ばないのですが、無線LANカードならよいのではという判断です。

購入したTX50EはマザーボードのPCIE 2.0 x 1のスロットが空いているのでそちらに接続しました。 PCIE 3.0 x4も空いていますが、そちらは(M.2を利用していると無効なので使えません。)

TX50EはBluetoothもついていて、USB 1_2のピンヘッダ(USB 2.0)に刺しておきました。このピンヘッダに刺すというのはピンを曲げてしまわないか実に怖いですね。 刺した後にlspciでみると、認識はされていることがわかりました。

$ lspci | grep -v AMD
...
06:00.0 Network controller: Intel Corporation Wi-Fi 6 AX200 (rev 1a)
...

BluetoothについてはUSB経由での接続となるのでlsusbで確認しました。

$ lsusb
...
Bus 001 Device 003: ID 8087:0029 Intel Corp. AX200 Bluetooth
...

lspci -vで詳細をみると、次のように必要なモジュールを教えてくれます。

06:00.0 Network controller: Intel Corporation Wi-Fi 6 AX200 (rev 1a)
    Subsystem: Intel Corporation Wi-Fi 6 AX200NGW
    Flags: fast devsel, IRQ 32
    Memory at fc500000 (64-bit, non-prefetchable) [size=16K]
    Capabilities: <access denied>
    Kernel modules: iwlwifi

Capabilitiesを確認するには、sudo lspci -v を実行しないといけないです。

Kernel driver in use: pcieport

06:00.0 Network controller: Intel Corporation Wi-Fi 6 AX200 (rev 1a)
    Subsystem: Intel Corporation Wi-Fi 6 AX200NGW
    Flags: fast devsel, IRQ 32
    Memory at fc500000 (64-bit, non-prefetchable) [size=16K]
    Capabilities: [c8] Power Management version 3
    Capabilities: [d0] MSI: Enable- Count=1/1 Maskable- 64bit+
    Capabilities: [40] Express Endpoint, IntMsgNum 0
    Capabilities: [80] MSI-X: Enable- Count=16 Masked-
    Capabilities: [100] Advanced Error Reporting
    Capabilities: [14c] Latency Tolerance Reporting
    Capabilities: [154] L1 PM Substates
    Kernel modules: iwlwifi

ファームウェアのインストール

Debian sidを利用しているので、iwlwifiのファームウェアfirmware-iwlwifiに含まれている。(はず)

firmware-iwlwifi/unstable 20230625-2 all
  Binary firmware for Intel Wireless cards

sudo apt install -y firmware-iwlwifiでファームウェアをインストールしたので、 sudo modprobe iwlwifiしてみました。 しかし、デバイスとしてはみえていません。 dmesgになにか手がかりがないか確認してみたところ次のようなメッセージが出力されていました。

$ sudo dmesg G iwl
[   56.856794] iwlwifi 0000:06:00.0: enabling device (0000 -> 0002)
[   56.860509] iwlwifi 0000:06:00.0: Detected crf-id 0x3617, cnv-id 0x100530 wfpm id 0x80000000
[   56.860519] iwlwifi 0000:06:00.0: PCI dev 2723/0084, rev=0x340, rfid=0x10a100
[   56.860598] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-77.ucode (-2)
[   56.860612] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-77.ucode (-2)
[   56.860614] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-77.ucode failed with error -2
[   56.860643] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-76.ucode (-2)
[   56.860654] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-76.ucode (-2)
[   56.860655] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-76.ucode failed with error -2
[   56.860672] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-75.ucode (-2)
[   56.860686] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-75.ucode (-2)
[   56.860687] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-75.ucode failed with error -2
[   56.860703] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-74.ucode (-2)
[   56.860714] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-74.ucode (-2)
[   56.860716] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-74.ucode failed with error -2
[   56.860730] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-73.ucode (-2)
[   56.860745] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-73.ucode (-2)
[   56.860746] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-73.ucode failed with error -2
[   56.860761] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-72.ucode (-2)
[   56.860771] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-72.ucode (-2)
[   56.860773] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-72.ucode failed with error -2
[   56.860787] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-71.ucode (-2)
[   56.860798] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-71.ucode (-2)
[   56.860799] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-71.ucode failed with error -2
[   56.860818] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-70.ucode (-2)
[   56.860830] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-70.ucode (-2)
[   56.860832] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-70.ucode failed with error -2
[   56.860848] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-69.ucode (-2)
[   56.873856] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-69.ucode (-2)
[   56.874960] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-69.ucode failed with error -2
[   56.876143] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-68.ucode (-2)
[   56.877324] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-68.ucode (-2)
[   56.881935] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-68.ucode failed with error -2
[   56.881965] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-67.ucode (-2)
[   56.883308] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-67.ucode (-2)
[   56.883766] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-67.ucode failed with error -2
[   56.883786] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-66.ucode (-2)
[   56.885136] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-66.ucode (-2)
[   56.885138] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-66.ucode failed with error -2
[   56.885157] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-65.ucode (-2)
[   56.887548] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-65.ucode (-2)
[   56.888045] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-65.ucode failed with error -2
[   56.888069] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-64.ucode (-2)
[   56.889515] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-64.ucode (-2)
[   56.889517] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-64.ucode failed with error -2
[   56.889531] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-63.ucode (-2)
[   56.889541] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-63.ucode (-2)
[   56.889543] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-63.ucode failed with error -2
[   56.889556] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-62.ucode (-2)
[   56.889566] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-62.ucode (-2)
[   56.889568] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-62.ucode failed with error -2
[   56.889581] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-61.ucode (-2)
[   56.889595] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-61.ucode (-2)
[   56.889597] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-61.ucode failed with error -2
[   56.889613] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-60.ucode (-2)
[   56.889624] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-60.ucode (-2)
[   56.889625] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-60.ucode failed with error -2
[   56.889639] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-59.ucode (-2)
[   56.889649] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-59.ucode (-2)
[   56.889651] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-59.ucode failed with error -2
[   56.889664] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-58.ucode (-2)
[   56.889675] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-58.ucode (-2)
[   56.889676] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-58.ucode failed with error -2
[   56.889689] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-57.ucode (-2)
[   56.889700] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-57.ucode (-2)
[   56.889701] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-57.ucode failed with error -2
[   56.889715] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-56.ucode (-2)
[   56.889727] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-56.ucode (-2)
[   56.889728] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-56.ucode failed with error -2
[   56.889743] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-55.ucode (-2)
[   56.889754] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-55.ucode (-2)
[   56.889756] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-55.ucode failed with error -2
[   56.889774] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-54.ucode (-2)
[   56.889785] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-54.ucode (-2)
[   56.889786] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-54.ucode failed with error -2
[   56.889801] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-53.ucode (-2)
[   56.889812] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-53.ucode (-2)
[   56.889813] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-53.ucode failed with error -2
[   56.889827] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-52.ucode (-2)
[   56.889837] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-52.ucode (-2)
[   56.889838] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-52.ucode failed with error -2
[   56.889851] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-51.ucode (-2)
[   56.889863] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-51.ucode (-2)
[   56.889864] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-51.ucode failed with error -2
[   56.889879] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-50.ucode (-2)
[   56.889889] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-50.ucode (-2)
[   56.889891] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-50.ucode failed with error -2
[   56.889892] iwlwifi 0000:06:00.0: minimum version required: iwlwifi-cc-a0-50
[   56.889894] iwlwifi 0000:06:00.0: maximum version supported: iwlwifi-cc-a0-77
[   56.889895] iwlwifi 0000:06:00.0: check git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git

やたらとファームウェアのロードに失敗している状況であることがわかります。

ファームウェアを最新版に更新する

apt showでファームウェアに関するパッケージの説明を確認してみたところ、次の結果が得られました。

$ apt show firmware-iwlwifi G AX

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

  * Intel Bluetooth AX201 (var 0 rev 0) configuration, version
  * Intel Bluetooth AX201 (var 0 rev 0) firmware, version 22.220.0.3
  * Intel Bluetooth AX201 (var 0 rev 1) configuration, version
  * Intel Bluetooth AX201 (var 0 rev 1) firmware, version 22.220.0.3
  * Intel Bluetooth AX101 (var 0 rev 3) configuration, version
  * Intel Bluetooth AX101 (var 0 rev 3) firmware, version 22.200.0.2
  * Intel Bluetooth AX201 (var 0 rev 4) configuration, version
  * Intel Bluetooth AX201 (var 0 rev 4) firmware, version 22.220.0.3
  * Intel Bluetooth AX201 (var 16 rev 4) configuration, version
  * Intel Bluetooth AX201 (var 16 rev 4) firmware, version 22.220.0.3
  * Intel Bluetooth AX201 firmware, version 22.220.0.3
  * Intel Bluetooth AX201 firmware, version 22.220.0.3
  * Intel Bluetooth AX201 firmware, version 22.220.0.3
  * Intel Bluetooth AX201 firmware, version 22.220.0.3
  * Intel Bluetooth AX201 (var 32 rev 0) configuration
  * Intel Bluetooth AX201 (var 32 rev 0) firmware, version 22.220.0.3
  * Intel Bluetooth AX201 (var 32 rev 1) configuration, version
  * Intel Bluetooth AX201 (var 32 rev 1) firmware, version 22.220.0.3
  * Intel Bluetooth AX201 (var 32 rev 4) configuration, version
  * Intel Bluetooth AX201 (var 32 rev 4) firmware, version 22.220.0.3
  * Intel Wireless AX211 Bluethooth configuration, version 22.220.0.3
  * Intel Wireless AX211 Bluethooth firmware, version 22.220.0.3
  * Intel Wireless AX2100 Bluethooth configuration, version 22.220.0.3
  * Intel Wireless AX2100 Bluethooth firmware, version 22.220.0.3
  * Intel Wireless Bluetooth AX201 configuration, version 22.220.0.3
  * Intel Wireless Bluetooth AX201 firmware, version 22.220.0.3
  * Intel Wireless Bluetooth AX201 configuration, version 22.220.0.3
  * Intel Wireless Bluetooth AX201 firmware, version 22.220.0.3

残念ながら、AX200は掲載されていません。

そこで、dmesgで言及されているようにlinux-firmwareのGitリポジトリを確認してみました。

https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git

firmware-iwlwifiは20230625-2なのでちょっと古いためのようです。 リポジトリのログを確認するとちょくちょくファームウェアが更新されています。

例えば、2023-08-28でAX200のファームウェアが更新されています。

https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/commit/?id=3892dc0121482d1fe5f3fa3a9943a89ef5838c85

firmware-iwlwifiのapt showの結果をみるかぎり、ibt系がAX200のファームウェアのようです。 コミットをみるかぎり、次の3つを更新したほうがよさそうです。

また、ibtだけじゃなくて、iwlwifi-cc-a0-もよりあたらしいバージョンが含まれています。 もし新しいファームウェアがあれば順にロードするようにしているようです。 下限と上限は次のように定められていました。

[   56.889892] iwlwifi 0000:06:00.0: minimum version required: iwlwifi-cc-a0-50
[   56.889894] iwlwifi 0000:06:00.0: maximum version supported: iwlwifi-cc-a0-77

したがって、以下の4つのファイルを所定のディレクトリにコピーしておけば良いです。

sudo cp linux-firmware/iwlwifi-cc-a0-77.ucode /usr/lib/firmware/
sudo cp linux-firmware/intel/ibt-20-0-3.sfi /usr/lib/firmware/intel/
sudo cp linux-firmware/intel/ibt-20-1-3.sfi /usr/lib/firmware/intel/
sudo cp linux-firmware/intel/ibt-20-1-4.sfi /usr/lib/firmware/intel/

sudo modprobe -a iwlwifiするとwlp6s0として認識されました。

7: wlp6s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000

TX50Eの電源管理を無効にする

省電力機能はアグレッシブすぎると切断要因になりかねないということで、無効化しておくことにしました。 (本当は実際に問題になってから無効化したほうがよいけれども)

電源管理を無効化するにはiwlmvmに対して次のような設定を行うと良いです。 (iwlwifiのpower_save=0は効果がない)

cat /etc/modprobe.d/iwlmvm.conf 
# parm:           init_dbg:set to true to debug an ASSERT in INIT fw (default: false (bool)
# parm:           power_scheme:power management scheme: 1-active, 2-balanced, 3-low power, default: 2 (int)
options iwlmvm power_scheme=1

power_schemeといったモジュールごとに指定できるパラメーターについてはsudo modinfo iwlmvmで調べられます。

実際に再起動すると次のように省電力を無効にできていました。

sudo iwconfig
wlp6s0    IEEE 802.11  ESSID:"..."  
          Mode:Managed  Frequency:5.52 GHz  Access Point: ...
          Bit Rate=1.0806 Gb/s   Tx-Power=22 dBm   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality=52/70  Signal level=-58 dBm  
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:273   Missed beacon:0

アンテナの向きを調節する

性能を最大限発揮するには、アンテナの受信状態を良好なものにしないといけません。

PCIE経由だとPCの背面からアンテナを生やすことになるので、設置場所によっては向きを調節しておかないと、 リンク速度が稼げません。

ルーターが80MHzの場合、リンク速度の上限は1201Mbpsに制限されるはずです。 実際次のような結果となりました。

$ sudo iw dev wlp6s0 link
Connected to ... (on wlp6s0)
    SSID: ...
    freq: 5520.0
    RX: 929804678 bytes (891697 packets)
    TX: 572620119 bytes (261878 packets)
    signal: -58 dBm
    rx bitrate: 648.5 MBit/s 80MHz HE-MCS 6 HE-NSS 2 HE-GI 0 HE-DCM 0
    tx bitrate: 1200.9 MBit/s 80MHz HE-MCS 11 HE-NSS 2 HE-GI 0 HE-DCM 0
    bss flags: short-preamble short-slot-time
    dtim period: 10
    beacon int: 100

速度計測結果はどうだったか

TX50E(AX200)で速度を計測してみたところ、これまで上り下りで400Mbpsを超えることはなかったが、 アップロードのときに400Mbps出せるようになりました。

ダウンロードはばらつきが大きいので速くなったかどいうかはなんともいえません。 ただ、継続的にダウンロードしているような状況で切断されることがなくなり安定しているようにみえます。

TX50Eは160MHzに対応しているので、仕様上は2ストリーム2404Mbpsに対応しています。 ただし、親機のルーターが80MHzまでしか対応していな場合は、2ストリーム1201Mbpsとなります。 そのためリンク速度自体1200Mbpsと本来の性能を活かしきれていないのはもったいないですが、 それでもいまのところ安定しているのはとてもよいです。

おまけで、Bluetoothも使えるようになったので、これまでWiFiアダプターとBTドングルのぶんのUSB端子が2つ空いたのも嬉しい。

この記事はUltimate Hacking Keyboard 60 v2で書きました。

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で執筆しました。