はちくもきりの技術メモ

個人的な技術メモ.

windowsからSSHでubuntuに接続するメモ(内部ネットワーク編)

設定や環境構築ってそんなにする頻度高くないからすぐ忘れますよね,私は忘れます.

やったこと

内部ネットワーク内でのssh接続.公開鍵認証を使います.
今回は完全自分用なのでセキュリティが甘いと思います.
公開鍵:サーバに置くやつ.誰かに見られてもいい.
秘密鍵:クライアントに置くやつ.誰にも見られるな.

環境

サーバ:ubuntu20.04 クライアント:6年前のwindows PC
クライアントソフト:MobaXterm

鍵の作成(クライアント)

ssh-keygen -t rsa -b 4096 -f [key name]

-t rsarsa方式(暗号化の種類らしい)での作成,-b 4096は鍵の長さの指定.
鍵の名前はデフォルトだとid_rsa(秘密鍵)とid_rsa.pub(公開鍵).
このコマンドを打つとパスフレーズを入力させられる.未入力で設定しないこともできる.セキュリティ的には多分入れたほうがいい.

公開鍵をサーバに送る

私はUSB使ったけど,コマンドもあるらしい(参考).

ssh-copy-id -i ~/.ssh/id_rsa.pub [リモートユーザー]@[リモートサーバーのホスト名]

サーバでの設定をする

USBで持ってきた公開鍵が~/.ssh/id_rsa.pubだとします.

cd
cat .ssh/id_rsa.pub >> .ssh/authorized_keys #追記にしないと複数ssh接続する時に死にます
rm .ssh/id_rsa.pub
chmod 700 .ssh
chmod 600 .ssh/authorized_keys

また,/etc/ssh/ssh_configを適当に書き換えます.
今回はPortを22から変えました.攻撃怖いので....そのほか,パスワード認証やルートでのログインを禁止にしたほうが安全です.
再起動します.

sudo service sshd restart

最後にポートを開きます.

sudo ufw allow 22 #さきほど設定したポート番号にします

クライアントで接続テスト

ぶっちゃけMobaXtermだとめっちゃくちゃ簡単.
起動→左上の"Session"→一番左の"SSH"で各種設定をします.
Advanced SSH settings→Use private keyで秘密鍵を設定できます.
ちなみに踏み台サーバとか使うときはNetwork settingsからできるらしい.外部からもつなぎたいので次はこれやる.

Ubuntu20.04+RTX3060 TiでGPU環境構築メモ[2022/04時点]

せっかく公開するので丁寧に書いたつもりですが,しょせんはメモですので悪しからず.
この記事に限らずだけど,こういう記事は特に環境やバージョンをしっかり確認しましょう!まるまるコピペで動く保証はあんまりないです!ほんとこれで詰まると悲しくなるので...気をつけようね....
なお,Ubuntuはすでに入っていて,ふんわりとCUI操作ができる状態からです.

目次(全体の流れも分かるよ)

[ 参考 ] 私の環境とversion

PyTorchはPythonで利用できる機械学習ライブラリであり,環境構築そのものには関わらずかつ比較的簡単に切り替えが出来ますが,バージョンの依存関係がある(後述)ので記載しています.

CPU INTEL CORE 05-10400F
GPU NVIDIA RTX3060Ti
OS Ubuntu 20.04 LTS
nvidia-driver 470
CUDA 11.1
cuDNN 8.4.0
PyTorch 1.8.2(LTS)
[ 準備 ] CUDAのversionを決める(わかってる人は飛ばしてね)

全体像を掴む,という意味も込めて一番はじめにやっておくと困りにくいと思います.
依存関係があるところは,

CUDA GPU(型番ではなくてアーキテクチャ)
CUDA nvidia-driver
CUDA cuDNN
CUDA ライブラリ(PyTorchとかTensorFlowとか)

このあたりです.
基本は使いたいライブラリのバージョンに合わせてCUDAのバージョンを決めます.nvidia-driverとcuDNNはCUDAに合わせてって感じで,インストールのときに正しいものを選べば大丈夫です.

まず,ライブラリのバージョンですが,動かしたいコードがある場合は指定されているバージョン,なければLTSが無難かなと思います.
PyTorchであれば公式のページ,またはprevious versionsで使いたいPyTorchバージョンに合わせたCUDAを確認してください.例えばPyTorch LTS(1.8.2)の場合はCUDA10.2とCUDA11.1が対応しています.
実はここは多少はがばがばでも動くときも多く,例えばCUDA11.3でもCUDA11.0でもPyTorch1.8を動かせるのですが,動かなかったときに原因の対処がしづらいので合わせといておいたほうが無難だとは思います.
次に,そのCUDAがGPUに対応しているかを確認します.結論をいうと,NVIDIA Ampereアーキテクチャ,具体的にはRTX30系とかA100とか,はCUDA10.x以前は非対応です.つまり例えば,PyTorch1.4.0はCUDA11.xに対応していないのでRTX3060 Tiでは使えません…
NVIDIAのドキュメント:CUDAとcuDNNとアーキテクチャの関係とか
あとは大丈夫だと思いますが,怖かったら一応確認しておいたほうがいいです.PyTorch LTS(1.8.2)はCUDA10.2とCUDA11.1が対応していて,私のGPU(RTX3060 Ti)はAmpereなので,今回はCUDA11.1を入れます.
また,本題とは関係ありませんが,この記事を執筆時点でAmpereの次のHopperが発表されています.今後出るGPUを買う場合は気に留めておいた方がいいです.

[ 準備 ] いつもの前処理(もはやおまじない)
sudo apt update
sudo apt upgrade
[ 準備 ] 既存のnvidia-driver, cuda, cudnnなどの削除

これは必要な人とそうでない人がいると思います.

sudo apt-get --purge remove nvidia*
sudo apt-get --purge remove cuda*
sudo apt autoremove
[ 準備 ] nouveauを無効化

nouveauというのはデフォルトのビデオカード向けのドライバ.
nvidia-driverがすでにインストールされていた人はやっているかもしれません.また,CUIオンリー環境(サーバとか)だといらんかも.
まずは今動いているか確認.

lsmod | grep nouveau

でなにも出なければOK,次の手順へ.なにか出た場合は有効なので無効化します.
お好きなエディタ(例はemacs)で下記ファイルを作成します.sudoは必要に応じてつけてください(私は必要でした).

sudo emacs /etc/modprobe.d/blacklist-nouveau.conf

ファイルの中身は下記.

blacklist nouveau
options nouveau modeset=0

書けたら設定の反映と再起動をします.

sudo update-initramfs -u
sudo reboot

最後に念の為もう一度lsmod | grep nouveauで確認することをおすすめします.

[ 準備 ] セキュアブートの無効化

参考先ではコマンドとか鍵とかでなんとかできててすごいなぁなんですが,私はよくわからなかったのでUEFIから無効化しました.
ちょっと正確かつ簡単に説明できる自信がないのでUEFIについての説明は省きます.もう本当にざっくり正確ではない説明をすると,コンピュータそのもの(not OS)の管理設定画面みたいな感じです.BIOSって呼ばれているかもしれません(これまたざっくりと,”UEFI=次世代のBIOS”みたいなイメージです.両者は混同されがち).
じゃあどうやってこの画面に行くねん,という話ですが,再起動して,起動中にあるボタンを連打します.あるボタンはマシンによって違いますが,F2Delが多いそうです.私のPCははぐれ者なのかF11でした.一応仕様書とか説明書に書いてあると思いますが,当てずっぽうでも入れはします.
けっこうビビる感じの画面が出てくると思いますが大丈夫です.これまたマシンによって呼び方が変わってくるのですが,"Advanced"メニューから"Secure Boot"の設定ができると思います. "Disable"とかにしましょう. あとは設定画面から出ます.多分"exit"とかがあると思います.
ドスパラのBIOS説明のページが操作する上ではわかりやすいかなと思ったのでおいておきます.ご参考まで.

[ 1 ] nvidia-driverのインストール

やっと本題です,長かったねすみません
まず推奨ドライバを確認します.

ubuntu-drivers devices

これ打つと下記のようにいろいろ出てくると思いますが,

$ ubuntu-drivers devices
WARNING:root:_pkg_get_support nvidia-driver-510-server: package has invalid Support PBheader, cannot determine support level
WARNING:root:_pkg_get_support nvidia-driver-510: package has invalid Support PBheader, cannot determine support level
== /sys/devices/pcixxxx ==
modalias : pci:xxxx
vendor   : NVIDIA Corporation
driver   : nvidia-driver-470-server - distro non-free
driver   : nvidia-driver-470 - distro non-free recommended
driver   : nvidia-driver-510-server - distro non-free
driver   : nvidia-driver-510 - distro non-free
driver   : xserver-xorg-video-nouveau - distro free builtin

基本的に"recommended"ってついているもので大丈夫です.CUDAのバージョンと対応しているかだけ確認しましょう.CUDA11.xの場合は450以上なら大丈夫です.
入れます.

sudo apt install nvidia-driver-470

再起動.

sudo reboot

確認.

nvidia-smi

四角い表が出たらOKです.表の右上の"CUDA Version"は入れることが可能な最新CUDAを示しているらしいので,自分の入れているCUDAと違っても大丈夫です.一番下の"Processes"は私はデスクトップ版のUbuntuを使っているので画面表示に使用されている分が4つありますが,CUIオンリー(サーバ用)の人は"no running processes found"って出ると思います.

$ nvidia-smi
Wed Apr xx xx:xx:xx 2022       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.103.01   Driver Version: 470.103.01   CUDA Version: 11.4     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  Off  | 00000000:01:00.0  On |                  N/A |
|  0%   48C    P8    15W / 200W |    338MiB /  7973MiB |      1%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A       8x2      G   /usr/lib/xorg/Xorg                 35MiB |
|    0   N/A  N/A      15x4      G   /usr/lib/xorg/Xorg                137MiB |
|    0   N/A  N/A      1x56      G   /usr/bin/gnome-shell               28MiB |
|    0   N/A  N/A      20x8      G   ...055xxxx702x706xxx6,1xx072      123MiB |
+-----------------------------------------------------------------------------+
[ 2 ] cudaのインストール

CUDA Toolkit Archiveからお好みのバージョンを選んでください.そうしたら以下みたいな画面になるので,ご自分の環境に合わせてぽちぽちします.runfileかdebかはお好みでいいと思いますが,runfileのほうが多分楽です.

CUDAのインストール
ぽちぽちするとコマンドを出してくれるので打っていきます.

wget https://developer.download.nvidia.com/compute/cuda/11.1.0/local_installers/cuda_11.1.0_455.23.05_linux.run
sudo sh cuda_11.1.0_455.23.05_linux.run --toolkit --silent --override

いや2行目提示されたコマンドsudo sh cuda_11.1.0_455.23.05_linux.runと違うやないかーい!となりますね.大丈夫です.
実はこのrunfileめちゃくちゃ優秀で,ドライバも一緒に入れてくれるんです.でも私達はさきほどドライバを入れました.この状態で提示されたコマンドをそのまま使うと"Existing package manager installation of the driver found"って言われちゃうんです.これはつまり「ドライバ入れたいんやけどもう入っとるよ,どないしよか?」ってマシンが困っています.
なので上記の通り,--toolkit --silent --overrideオプションをつけます.なお,うっかりそのまま打ってマシンが困ったときは"Abort"を押すと戻れます.参考

パスを追加するため,以下を~/.bashrcに追記します.

export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"

書けたら設定を反映するため再起動します.

source ~/.bashrc

ここまでできたらnvcc -Vって打ってみてください.CUDAのバージョンが出てくると思います.

$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2020 NVIDIA Corporation
Built on Tue_Sep_15_19:10:02_PDT_2020
Cuda compilation tools, release 11.1, V11.1.74
Build cuda_11.1.TC455_06.29069683_0
[ 3 ] cudnnのインストール

ここからダウンロードしてください.会員登録(無償)が必要です.面倒だね
バージョンは特にこだわりがなければ最新版でいいと思います.CUDAのバージョンやその他の都合で過去のバージョンが必要な場合はarchiveからどうぞ.
ダウンロードしたら入れます.

sudo dpkg -i cudnn-local-repo-ubuntu2004-8.4.0.27_1.0-1_amd64.deb
[おつかれ!] 動作確認

適当になにか回して別ウィンドウとかタブとかでnvidia-smiを打ってプロセスが走っていたら大丈夫です.
…でもいいかなって思ってるんですが,一応ちょっとだけ真面目に書きます.今回はpytorchでやります.バージョンは好きなの入れてください.python3とpip3は入ってる想定です.あと環境汚したくない人は適当に環境作っておいてください.

簡単なやつ:

$ pip3 install torch==1.8.2+cu111 -f https://download.pytorch.org/whl/lts/1.8/torch_lts.html
$ python
Python 3.6.15 (default, Jan xx 2022, xx:xx:xx) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.cuda.is_available()
True
>>> torch.cuda.get_device_name()
'NVIDIA GeForce RTX 3060 Ti'
>>> 

torch.cuda.is_available()でTrue,torch.cuda.get_device_name()で正しいGPUの名前が出てきたら経験上は大丈夫です.

難しい(難しくはない)やつ:
適当にMNISTのチュートリアルをやります.
ダウンロードします.

svn export https://github.com/pytorch/examples/trunk/mnist/

移動します.

cd mnist

README.mdに書かれたとおりに打ちます.#が先頭についている行は無視します.

pip install -r requirements.txt
python main.py

動くと思うので,ターミナルの別タブなり別ウィンドウなりでnvidia-smiを打ちます.

$ nvidia-smi
Wed Apr xx xx:xx:xx 2022       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.103.01   Driver Version: 470.103.01   CUDA Version: 11.4     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  Off  | 00000000:01:00.0  On |                  N/A |
|  0%   53C    P2    75W / 200W |   2005MiB /  7973MiB |     33%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A       8x2      G   /usr/lib/xorg/Xorg                 35MiB |
|    0   N/A  N/A      1xx4      G   /usr/lib/xorg/Xorg                137MiB |
|    0   N/A  N/A      1xx6      G   /usr/bin/gnome-shell               38MiB |
|    0   N/A  N/A      2xx8      G   ...05xxxx070xxx06xxx6,1xxx72       78MiB |
|    0   N/A  N/A   1244458      C   python                           1699MiB |
+-----------------------------------------------------------------------------+

一番下にある0 N/A N/A 1244458 C python 1699MiBが今回っているmain.pyです.
これで動作確認も出来ました.お疲れ様でした!

最後にいらないとは思いますが気になる方はあとかたづけも.

sudo apt autoremove
sudo apt clean
参考

UbuntuへNVIDIAのドライバを入れる際の注意点
【備忘録】Ubuntu 20.04 LTS + GPU 環境構築 (2021年3月版)
【備忘録】ubuntu20.04LTSにcuda-toolkit-10.1を入れる方法

vimiumでマウスなしブラウザ生活を目指す

なるべく楽に生きていきたい.はちくもきりです.
エンジニア二年目,マウス使うとキーボードから手が離れて非効率なので,マウスなしでブラウザを使う方法はないんか,ということで.

探したらありました.便利な世の中です.
Vimium(Chorome拡張)
Vimのようにブラウザを操作しよう,というものらしいです.ちなみに私はほとんどVimを触ったことがないです.

あとは適当にチートシートを検索すれば出てきますし,wikiもあるみたいなのですが,私得チートシートも書いておきます.なぜならここはメモ帳なので!車輪の再発明っぽいけど知りません! 英語得意な人は一番上のヘルプだけ覚えればとりあえずなんとかなりそう
なお,こちら,個々人でもカスタムができるようです.すごいね.  

キー できること
? ヘルプ(etcで抜ける)
j 下にスクロール
k 上にスクロール
d 下に半ページスクロール
u 上に半ページスクロール
gg 最上部までスクロール
G 最下部までスクロール
h 左にスクロール
l 右にスクロール
J 左のタブへ
K 右のタブへ
H 1つ戻る(いわゆるブラウザバックってやつ)
L 1つ進む
x タブを閉じる
X 閉じたタブをもとに戻す
t 新しいタブを開く
r リロード
f / F ページ内リンクを現在の(新規の)タブで開く
o / O 履歴やurlから検索できる(大文字は新規タブ)
b / B ブックマークから検索できる(大文字は新規タブ)
yy 現在のアドレスバーのリンクをコピー
p / P クリップボードのリンクを現在の(新規の)タブで開く

f / Fがちょっとややこしいのですが,google検索に適当になにか打ち込んで出てきた検索ページでfって押してみてください.

`f`を押した時
この状態で,例えば一番上のページがみたいなと思ったらFFって押すとなんとそのページに飛べちゃいます!すごい!

たださすがに万全ってわけでもなくて,なんか時々うまく動かないとかあります.わかりやすいとこだとnotionとかは相性だめです.
とはいえ相当効率化が図れそうなのでがんばって覚えたいです.キーボードショートカットって覚えるとめちゃ便利なんだけど覚えるまでが大変みたいなとこありますね….