2022/6/29

shell: ls folder only

因為 folder 最後都會加上 '/',所以就是:
ls -d ./*/
其實是想要找出最大 size 的 folder...
ls -d ./*/ | xargs du -sc | sort -n

2022/6/28

pytorch cudatoolkit version and local cuda version

ref: 使用新mb/hardware 的人都會遭遇這個問題,必須要安裝新版的 cuda,但是 pytorch 又不支援這摸新的版本。

根據以上ref 的說明,pytorch 會自帶 cuda toolkit 的 binary,部會用到 local 安裝的,所以local 甚至不用裝 cuda。

所以只要 pytorch 的cuda 版本跟 driver 是 相容可以用的,就可以了,不用管 local (host) 安裝的 cuda 版本。
-- 真正要用到 local 的 cuda toolkit,只有 build pytorch from source 的時候才需要。
另外,到 -extra-index-url https://download.pytorch.org/whl/cu113 去看,好像有 support 到 cu116..

雖然如此,package manger 版本的 pytorch 使用的 cuda 版本如果太舊,沒有支援新的 GPU,就會出現 ref:2 的錯誤。
這時候就要安裝新版本的 pytorch,或是用 url 或是 channel指定 cuda 版本。

測試一下cuda 版本與 trainning speed 有沒有關係。
titan rtx, cuda 11.2
pip 安裝 default torch 1.11,未指定 cuda 版本。
real	3m48.122s
user	4m44.344s
sys	0m15.251s



可以用 python module command 列出package content:
pip package default:
$ python -m torch.utils.collect_env
Collecting environment information...
PyTorch version: 1.11.0+cu102
Is debug build: False
CUDA used to build PyTorch: 10.2
ROCM used to build PyTorch: N/A

OS: Ubuntu 18.04.5 LTS (x86_64)
GCC version: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Clang version: Could not collect
CMake version: version 3.10.2
Libc version: glibc-2.27

Python version: 3.10.4 (main, Mar 31 2022, 08:41:55) [GCC 7.5.0] (64-bit runtime)
Python platform: Linux-4.15.0-166-generic-x86_64-with-glibc2.27
Is CUDA available: True
CUDA runtime version: 10.2.89
GPU models and configuration: GPU 0: TITAN RTX
Nvidia driver version: 460.91.03
cuDNN version: Probably one of the following:
/usr/lib/x86_64-linux-gnu/libcudnn.so.7.6.5
/usr/local/cuda-10.2/targets/x86_64-linux/lib/libcudnn.so.7.6.5
HIP runtime version: N/A
MIOpen runtime version: N/A

Versions of relevant libraries:
[pip3] numpy==1.23.0
[pip3] torch==1.11.0
[pip3] torchvision==0.12.0
[conda] numpy                     1.23.0                   pypi_0    pypi
[conda] torch                     1.11.0                   pypi_0    pypi
[conda] torchvision               0.12.0                   pypi_0    pypi
使用: url 指定 whl/cu116:
$ python -m torch.utils.collect_env
Collecting environment information...
PyTorch version: 1.12.0+cu116
Is debug build: False
CUDA used to build PyTorch: 11.6
ROCM used to build PyTorch: N/A

OS: Ubuntu 18.04.5 LTS (x86_64)
GCC version: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Clang version: Could not collect
CMake version: version 3.10.2
Libc version: glibc-2.27

Python version: 3.10.4 (main, Mar 31 2022, 08:41:55) [GCC 7.5.0] (64-bit runtime)
Python platform: Linux-4.15.0-166-generic-x86_64-with-glibc2.27
Is CUDA available: True
CUDA runtime version: 10.2.89
GPU models and configuration: GPU 0: TITAN RTX
Nvidia driver version: 460.91.03
cuDNN version: Probably one of the following:
/usr/lib/x86_64-linux-gnu/libcudnn.so.7.6.5
/usr/local/cuda-10.2/targets/x86_64-linux/lib/libcudnn.so.7.6.5
HIP runtime version: N/A
MIOpen runtime version: N/A
Is XNNPACK available: True

Versions of relevant libraries:
[pip3] numpy==1.23.0
[pip3] torch==1.12.0+cu116
[pip3] torchaudio==0.12.0+cu116
[pip3] torchvision==0.13.0+cu116
[conda] numpy                     1.23.0                   pypi_0    pypi
[conda] torch                     1.12.0+cu116             pypi_0    pypi
[conda] torchaudio                0.12.0+cu116             pypi_0    pypi
[conda] torchvision               0.13.0+cu116             pypi_0    pypi

PyTorch, package manager and cuda support

pytorch 的安裝隨著python package manager 的不同,結果也不一樣。
依照pytorch 的安裝說明 的話,cuda or cpu only各有明確的指令。

例如:

pip 安裝, cuda support:
pip3 install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113
-- cpu 的話,就 cu113 改 cpu。


conda 安裝:
conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch
-- cpu 的話就是 cudatoolkit=11.3 改成 cpuonly


但是看 yolov5 的 requirements.txt,其中 torch 的部份..:
torch>=1.7.0
沒有指定 ..
-- 所以會是有 cuda support ?
用 pip install torch,不加上 url。安裝完後,用 torch.cuda.is_available() 測試看看。
在有 cuda 的機器上,是 True,在沒有 cuda 的機器上,是 False。
但是用 pip freeze 看安裝的 package full name 都是 torch=1.11.0

-- 發現,若是 10.2,則pip install torch 時、不須指定 download whl。反而是 cpu 板才要。
所以 package manager 版本應該有 support 了。
測試,在 cuda 的機器上 pip install torch 指定 download whl cpu,cuda.is_available() 是 False.

結論大概是..
package manager : pip 已經把 pytorch 10.2, 11.3 都納入 package repo 中了。但是 conda 沒有。所以 conda 安裝一定要指定 cudatoolkit 和 python channel

yolov5 其實有要求 python 版本:
Python 3.7.0 required by YOLOv5

2022/6/23

test securetty in raspberry pi with buildroot

用 buildroot build 一個 system image
mkdir pibuildroot && cd pibuildroot
wget ...
tar zxvf ..
cd ..
看一下 board 下面很多 raspberrypiX 都 ln 到 raspberrypi。
裡面有 readme.txt。
有說 pi3 的話..
make raspberrypi3_defconfig
用 make help 會列出一堆 make target。
然後用 make menuconfig 去看,就是arm 的 config 了。
而且因為是 pi3, 會用 cortex A53,不是 pi 一代的 arm11

要 enable PAM (linix-pam) 的話,在 packages/linux-pam
從 packages/Config.in 可以找到 linux-pam 的 menuconfig 位置。
Target packages -- Libraries -- Other
從 linux-pam 的說明(警告),說,linux-pam 要 clibc 或是 glibc 才行。
所以menuconfig 的 toolchain 中,原來是 uclibc-ng,要改為 glibc。
這樣選完,就可以check linux-pam 了。

make 完畢,在 output/images 下的 sdcard.img,就拿來 dd 到 sdcard。
開機,console 就可以看到訊息。

沒有 check linux-pam 時,/etc 下沒有 pam.d 目錄。
check 之後,就有了。

在 /etc/pam.d/login 加一行:
auth		required	pam_securetty.so
然後新增一個 /etc/securetty 空檔案。
為了避免沒版法login,新增一個 user。

這樣reboot 後,可以發現 在 uart 已經無法用 root login 了(login incorrect),但是用剛剛新增的 user 可以。
用新增的 user login 後, su - 成 root。

su - 成 root 後,修改 /etc/securetty,加上
console
-- 因為用 w 看,login TTY 是 console,不是 tty1, ttyS0 之類,所以用 console
reboot,就發現又可以用 root login 了。

把 securetty 的console 拿掉,確認無法 login 後,再把 /etc/pam.d/login 的 auth pam_securetty.so 拿掉,是可以用 root login 的。
所以確認是 pam.d/login 的 auth pam_securetty.so 讓 /etc/securetty 生效。



有關buildroot 跟 busybox 在 PAM 上的關聯。
buildroot 的 script: package/busybox/busybox.mk: 有根據 buildroot 的 PAM 設定,自動設定 busybox 的 PAM。
# PAM support requires thread support in the toolchain
ifeq ($(BR2_PACKAGE_LINUX_PAM)$(BR2_TOOLCHAIN_HAS_THREADS),yy)
define BUSYBOX_LINUX_PAM
        $(call KCONFIG_ENABLE_OPT,CONFIG_PAM,$(BUSYBOX_BUILD_CONFIG))
endef
BUSYBOX_DEPENDENCIES += linux-pam
else
define BUSYBOX_LINUX_PAM
        $(call KCONFIG_DISABLE_OPT,CONFIG_PAM,$(BUSYBOX_BUILD_CONFIG))
endef
endif
所以會根據buildroot 的 PAM check/uncheck disable/disable busybox 的 PAM 設定。
所以要測試,enable linux-pam, disable busybox pam support 的話,就要到 output/build/busybox-1.31.1 單獨做 busybox 的 menuconfig。
的確沒有效了,root login OK

改用 util-linux 的 login。
--uncheck busybox 的 login

確認是 OK的,可以用 pam.d/login 跟 securetty 來限制 root login console

2022/6/13

Use vi to find non-ascii character

先下 command:
: set list
這樣,non ascii code 會high light 出來。
再用search:
/[^\x00-\x7F]
就會一個一個搜尋出來 (用 n)

只找一個,例如:0x9c,就用
/[\x9c]

mplay : mplay 2 videos on 2 monitors

用 mplayer 指定播放的 monitor,用 screen option
--用 man player 可以列出比較仔細的 option.

所以,在第二個 monitor,永久反覆全螢幕播放 此目錄下所有檔案:
mplayer -loop 0 -screen 0 -fs *

** 結果 mpv 跟 mplayer 是不一樣的東西...


如果是 ssh 過去,要在 機器上的monitor 播放,而不是在 ssh client 這邊播放。
ssh 過去後,要
export DISPLAY=:0
再播。

-- 結果還是不行,要用 mpv 的 screen option 才行。

ssh 連線..
export DISPLAY=:0

mpv 播放,with screen option:
mpv --screen=0 myfile.mp4
--screen=1 的話就會播到令一個 monitor

2022/6/10

2022/6/6

memo - gdb, argument and source location

大概就是...
gdb --args executablename arg1 arg2 arg3
進入 gdb 後,用指令 directory 指定source code 所在位置 (absolute path)
gdb> directory /data/

2022/6/1

Read mender-store with python code

讀取 mender-store 的內容...
(lmdb) charles-chang@e431focal:~$ python
Python 3.10.4 (main, Mar 31 2022, 08:41:55) [GCC 7.5.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import lmdb
>>> env = lmdb.open('./mender-store',subdir=False)
>>> txn = env.begin()
>>> myList = [ key for key, _ in txn.cursor()]
>>> print(myList)
[b'artifact-name', b'artifact-provides', b'authtoken']
>>> 
>>>print(txn.cursor().get(b'artifact-name'))
b'1.0.1.30rc1-deltafrom-1.0.0.28patch3'
>>> print(txn.cursor().get(b'artifact-providese'))
None
>>> print(txn.cursor().get(b'artifact-provides'))
b'{"rootfs-image.checksum":"457d85413d8dbdb2c278b4740493efb3712290f36668a919dd4297ae60ca6157","rootfs-image.version":"1.0.1.30rc1"}'

另外,lmdb 的 put/get :
>>> import lmdb
>>> env = lmdb.open('./testlmdb')
>>> txn = env.begin(write=True)
>>> txn.put(key=b'1',value=b'abc')
True
>>> txn.put(key=b'aaa',value=b'{a=1},{b=2}')
True
>>> txn.commit()

>>> txn = env.begin()
>>> for key,value in txn.cursor():
...     print(key,value)
... 
b'1' b'abc'
b'aaa' b'{a=1},{b=2}'


所以寫一個小程式,可以簡單create 這個 key-value 的 lmdb data file: 是用lmdb 的 code。

這樣,只要:
./mydb ./mender-store artifact-provides "{\"rootfs-image.checksum\":\"457d85413d8dbdb2c278b4740493efb3712290f36668a919dd4297ae60ca6157\",\"rootfs-image.version\":\"1.0.1.30rc1\"}"
就可以新增 value
然後 mylist 就是跟 python 一樣的function,列出 db 中所有 key-value record.