仙豆のレシピ

ちょっとしたことでも書いていく姿勢で

Ubuntu22.04 環境構築メモ

自宅のメインマシンを10年ぶり(!)にリプレイスして ubuntu22.04 に CUDA 周り含めてセットアップしたので手順をメモ。

特に苦労がなくて驚いた。steam でゲームも問題なくできそう。

packages

必要パッケージインストール

sudo apt install git vim zsh tmux xsel python3.10-dev

CUDA, driver

# CUDA-Tool-Kit install (apt 経由)
$ echo 'export PATH="/usr/local/cuda/bin:$PATH"' >> ~/.zshrc.local
$ echo 'export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"' >> ~/.zshrc.local
$ echo "blacklist nouveau \n options nouveau modeset=0" > /etc/modprobe.d/blacklist-nouveau.conf
$ sudo update-initramfs -u
$ sudo reboot
# cudnn install
(省略)

suspend すると CUDA が壊れる対処

画面描画等は問題ないが PyTorch から GPU が見えなくなったりするので対処する必要がある。 この方法 どおりにやればうまくいったっぽい。やはり Arch Wiki は神。 NVIDIA のドライバがデフォルトでは suspend 時に video memory の必要最小限しか保存しないのを全部保存するように設定する感じの模様。

$ sudo echo 'options nvidia NVreg_PreserveVideoMemoryAllocations=1 NVreg_TemporaryFilePath=/tmp' > /etc/modprobe.d/nvidia-power-management.conf
$ sudo update-initramfs -u
$ systemctl enable nvidia-suspend.service
$ reboot

lock

なぜか lock ができなかったのでできるようにする: https://askubuntu.com/questions/1423645/screen-lock-not-working-in-ubuntu-22-04

mouse button

多ボタンマウスのボタンを設定する:参考

$ sudo apt install xdotool xbindkeys
$ vim .xbindkeysrc

tmux の buffer を能動的にクリップボードに移す

tmux の buffer とクリップボードが連携してると便利だけど基本的にそれらは独立していてほしい(自動で buffer とクリップボードの中身が同じになってほしくない)ときの設定方法。

基本的に以下にあるようにすればよい: unix.stackexchange.com

自分の設定は以下:

# tmux buffer -> clipboard
bind-key -T prefix C-c run "tmux save-buffer - | xsel --clipboard --input"

# clipbard -> tmux buffer
bind-key -T prefix C-v run "tmux set-buffer -- \"$(xsel --clipboard --output)\"; tmux paste-buffer"

(EDIT 2023/07/19: 特定の文字列(e.g., -V) でうまく動かなかったので -- を追加)

こうすると prefix + C-c で tmux の buffer がクリップボードに入り、 prefix + C-vクリップボードの値が tmux の buffer に入る。


そういえばこれ関係でいうと

https://twitter.com/senz1024/status/1529475979118546944

がいまだに解決できてないなあ

Zotero を自前ビルドで運用してみる

Zotero で文献管理を試していたらクライアントに少し手を入れたくなった。

Plugin の仕組みもあるみたいだけど、ちょっと触ってみた感じ自分のやりたいことができるかよくわからなかったので、とりあえずソースコードをいじって自分でビルドしてみることにしたので諸々メモ。

ソースコードhttps://github.com/senz1024/zotero

最終的に現状こんな感じになっている↓。

続きを読む

numpy覚書

大したことしてないけど忘れたとき用に書いておく。

命名が微妙なのはまあ文脈によって変えるという感じで)

one_hot

def one_hot(v):
    return np.eye(v.shape[1], dtype=int)[np.argmax(v, axis=1)]

n個のd次元ベクトルに対し、それぞれのベクトルで最大の要素を1他を0にしたベクトルを返す。具体的には以下。

>>> v
array([[0.1, 0.2, 0.7],
       [0.5, 0.3, 0.2],
       [0.3, 0.3, 0.4]])
>>> one_hot(v)
array([[0, 0, 1],
       [1, 0, 0],
       [0, 0, 1]])

仕組みはnp.eye()n \times n単位行列を生成、np.argmax()vの各ベクトルの最大値のインデックスを並べたn次元ベクトルを生成しそれを添え字とする。

count_class

def count_class(v):
    return np.sum(one_hot(v), axis=0)

n個のd次元ベクトルに対し、各インデックスごとにそのインデックスが最大値をとるベクトルの個数を現した配列を返す。

>>> v
array([[0.1, 0.2, 0.7],
       [0.5, 0.3, 0.2],
       [0.3, 0.3, 0.4]])
>>> count_class(v)
array([1, 0, 2])

one_hot()してaxis=0で足すだけ。

select_classes

def select_classes(v, cls):
    return v[np.isin(np.argmax(v, axis=1), cls)]

n個のd次元ベクトルに対し、最大値のインデックスが指定したいずれかの値とマッチしているベクトルのみを返す。

>>> v
array([[0.1, 0.2, 0.7],
       [0.5, 0.3, 0.2],
       [0.3, 0.3, 0.4]])
>>> select_classes(v, [0, 1])
array([[0.5, 0.3, 0.2]])
>>> select_classes(v, [1, 2])
array([[0.1, 0.2, 0.7],
       [0.3, 0.3, 0.4]])

np.isin()vの最大値のインデックスがclsに含まれているか否かの真偽値ベクトルを生成し添え字に利用。

ちなみにnp.isin()はnumpyのversion 1.13.0 から入ったらしく、これが無いときは以下のようにしてた。

def select_classes(v, cls):
    ind = np.zeros(v.shape[0], dtype=bool)
    v_cls = np.argmax(v, axis=1)
    for c in cls:
        ind |= (v_cls == c)
    return v[ind]

おまけ

pythonインタラクティブシェル便利だけど、毎回import numpyするのめんどうなので以下のようにしておくとコマンドラインnumpyと打てばnumpyをインポートした状態でインタラクティブシェルを始められる。

$ echo "import numpy as np" > ${HOME}/.startup_numpy.py
$ alias numpy="PYTHONSTARTUP=${HOME}/.startup_numpy.py python"

Thinkpad X1 Carbon Gen6にUbuntu入れたらスリープ時にバッテリー食いまくる問題の対処、簡易版

Thinkpad X1 CarbonにUbuntuを入れて使っていて、先日マシンがGen1からGen6になった。ディスプレイが良くなってたりして満足度は高いが、スリープ時の消費電力がすさまじくスリープで充電が一晩持たないという問題が発生していた。

環境はThinkpad X1 Carbon Gen6にUbuntu 16.04(今回の問題は18.04でも発生するらしいけど、それはともかく早く検証して18に上げよう…)

続きを読む