2025/2/27

Enable SSH Server in Windows

是 Windows 10,所以參考: 測試有沒有安裝,在 PowerShell 下:
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
出現結果:
Name  : OpenSSH.Client~~~~0.0.1.0
State : Installed

Name  : OpenSSH.Server~~~~0.0.1.0
State : NotPresent
所以安裝 server:
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0


Path          :
Online        : True
RestartNeeded : False

如果已經裝了,但是沒有設定自動啟動,就要手動啟動:
Start-Service sshd

然後linux就可以用 ssh 連回:
$ssh loyaltec\\charko.chang@192.168.144.78

2025/2/20

Intel Ultra 7, NPU.

要注意 intel 的 ai driver, library, toolkit 有分給 GPU (Arc) 跟 NPU 用的。

要先依照 linux-npu-driver 說明,自己 build driver. so 然後 install
因為後來 run 測試程式需要 build compiler with driver. 所以依照後面那個 "Building a driver together with the compiler" 說明比較好。
我有checckout v1.13.0 然後:
cd linux-npu-driver
git submodule update --init --recursive

cmake -B build -S . -DENABLE_NPU_COMPILER_BUILD=ON
cmake --build build --parallel $(nproc)

# install the driver in the system
sudo cmake --install build --prefix /usr

# reload the intel_vpu module to load new firmware
sudo rmmod intel_vpu
sudo modprobe intel_vpu
這樣就會 build NPU plugin 和 OpenVINO runtime
記得要把自己加到 render group.

最後 的 driver test,要在 linux-npu-driver 下做這些:
# Prepare the add_abc model in path pointed by basic.yaml
mkdir -p models/add_abc
curl -o models/add_abc/add_abc.xml https://raw.githubusercontent.com/openvinotoolkit/openvino/master/src/core/tests/models/ir/add_abc.xml
touch models/add_abc/add_abc.bin

# Run tests with add_abc.xml
npu-umd-test --config=validation/umd-test/configs/basic.yaml
才 run 得起來。

readme 的 llm example 跑不起來,會說缺 config,要 run example folder 下的 tinyllm。

run example folder 下的 code,一直會出現問題,一直到把 transformers downgrade 到 4.43.0 才 OK (在某個 downgrad 的過程中出現 linux-npu-driver 需要transformers >= 4.43.0)。
使用太新版會出現 rotary .. error
太舊版光是安裝就會出現 Tokenizer compile error
如果安裝過程出現 openssl-sys error,而系統又有安裝,是因為沒有安裝 pkg-config



另外用 gpu 跑 ollama 的可能參考:


這個方法成功了,又簡單,只是不知道最後是不是成功用 GPU run 了 (還是 run 在 gpu ?) 先依照Installing Client GPU,加入 intel repo. 安裝
sudo apt-get install -y libze-intel-gpu1 libze1 intel-opencl-icd clinfo intel-gsc libze-dev intel-ocloc
然後 download zip,解開就可以 run 了,有一個 script 啟動 ollama server,另外用 ollama 命令就跟平常一樣。
在 ollama server 的 output log 可以看到它有找到 intel GPU,並把一些 layer 交給 GPU.
但是還是一樣很慢...

2025/2/15

modify ollama model for cline

cline 使用 ollama 的話,有些 model 會一直 repeat 說過的話,然後出現Error.例如 deepseek-r1:14b
* cline is having trouble...

Cline uses complex prompts and iterative task execution that 
may be challenging for less capable models. For best results, 
it's recommended to use Claude 3.5 Sonnet for its advanced 
agentic coding capabilities.
這是因為 context windows 不夠大 (default 是 4096)
而 cline 需要很大的 context window.

所以要修改 context window 才行。

ollama 可以用 /parameter 命令來修改。
但是 cline 啟動的 ollama model 沒辦法這樣做。
所以要用 Modelfile 修改 model 的 default config.

ref: 修改 ollama 內的 model 的方法,就寫一個 Modelfile,放進要修改的參數,然後用 ollama command create 一個新 mode.
例如:
$ cat Modelfile-deepseek 
FROM deepseek-r1:14b

PARAMETER num_ctx 32768
然後用 ollama command:
ollama create deepseek-r1:14b-32k -f Modelfile-deepseek
create 完,用 ollama list 就可以看到 deepseek-r1:14b-32k 這個model

cline 改用這個 model,就不會有 Error 了。


但是要注意改num_ctx 改大之後,ollama load model 的 vram 也變大了。
以 deepseek-r1:14b 來看,num_ctx=4090 時,varm 是 10G
換成 num_ctx=32768 之後,vram 是 17G


other ref: num_ctx 是 model 可以記住的token 長度
num_predict 是 model 可以生成的 token 長度

2025/2/10

Transforms.ToTensor( ) 的注意事項

Pytorch 的 transforms.ToTesor()() 會把numpy 換成 tensor.
但是dimension sequence 不一樣.

ToTensor()()假設參數的 numpy array 是從 PILImage 來的,dimension是: H,W,C
ToTensor()()的 output,符合 pytorch 的 sequence, dimemsion 是: C,H,W

所以 經果 ToTensor( ), array 的 order 會被改掉。

所以...一個 400x500 的 jpg...
img = Image.open('image1.jpg')

tensor1 = transforms.ToTenor()(img)
tensor2 = torch.from_numpy(np.array(img))
tensor1 的 dimension sequence 是 [3,400,500]
tensor2 的 dimension sequence 是 [400,500,3]

另外 tensor1 的 dtype 是 float32, tesor2 是 uint8.
而且 tensor1 會做 normalize.

DeepSeek Janus

原來 deepseek-janus pro 有寫好 webui,是用gradio.
就是 clone...
git clone https://github.com/deepseek-ai/Janus.git
然後安裝 requirements.txt

最後啟動 demo/app_januspro.py 或是 demo/app_janusflow.py 就可以。

要注意的是
  • python 要 3.11
  • torch 要改 2.2.2
  • cd Janus && export PATHONPATH=`pwd`
  • 最後啟動的 app_janusXXX.py 在 demo.launch( ) 的 argument,要把 share=True 改成 server_name=0.0.0.0
Gradio 啟動時,share=True的話,會啟動frp,連到外部 proxy.
server_name=0.0.0.0 就是對 public ip,而不只是 127.0.0.1

2025/2/5

ssh connect with X forward in Windows Command console

ref: 首先Windows 要 Run Xserver,一般用 Xming 或是 XcXsrv。
然後在 Windows Command Console 要設定環境變數 DISPLAY
set DISPLAY=127.0.0.1:0.0
實際上後面的意思是
127.0.0.1:display_number.0.
雖然我也不知道 XLauncher 的 display number 是哪個...
可以在windows status bar 上把游標移到 X server 的地方停一下,會顯示 0.0.

然後就可以用 ssh -Y 連線了,因為 Windows 的 ssh client 沒有 -X 選項.
-Y 是 untrust X forward.
-X 是 trusrt X forward.


一定要設完環境變數再連 ssh,不然 ssh 不會設定好連線後, linux 端的環境變數。



要啟動 gnome-terminal的話,ref:Getting gnome-terminal via SSH and Xming,藥用
dbus-launch gnome-terminal



remote X 時,用 python 的 matplotlib.pyplot.show( ) 常常出現問題,
例如會說
libEGL warning: DRI3: failed to query the version
libEGL warning: DRI2: failed to authenticate
libEGL warning: DRI3: failed to query the version
有說明說,在 import matplotlib 後,加上:
matplotlib.use('TkAgg')
就可以。

2025/2/3

Fast RCNN

ref: Fast-RCNN 是一種 2stages 的 object detection network。
  • stage 1 : 把image 經過conv 變成 feature map,再用 RPN 把 feature map 上的region (包含物件的區域) 都找出來
  • stage 2 : 把所有regsion 都從 feature map 上切割出來,辨識它們的種類和位置大小
Stage 1 中,找出物件區域的方法,是 Anchor Box.
自己決定feature map 以每個格點為中心,都有N個 anchor box.
這N個 anchor box 的大小和長寬比例都不一樣。

然後再 feature map 上,針對每個格點上的每個 anchor box,判斷他是哪一個 class,或是都不是,就指定他是 background class。
所以RPN 的輸出是 class 和 regression(box 的 w,h).
然後每個featuer map 的格點都有 N 個 anchor box 對應的 class 和 regbox 值。
class : W, H, anchor_number, 2
Regre : W, H, anchor_numbwe, 4

RoIPool

一直看不懂 RoIPooling 是要做什麼用的。
ref 的那一篇就有說明了。

fast-rcnn 是 2-stages, 先把物件的區域(Region)辨識出來,並且把 feature map 上對應的Region 切出來。
這樣切出來的region 一定大小不一樣。
因為這些區域要經過 stage2,辨識出 class 和 bounding box,這是經果兩個各自的 linear (fc) 層做的。
fc 層的輸入必須是固定大小,
所以剛剛那些 stage 1 辨識出來的 region,都要scale 成同樣大小,符合 fc 的輸入。
這個scale 的方法就叫做 PoIPOOL,不單純用 scale是因為計算方便(?),然後用 maxpooling 一樣的方法,取區域中最大的值。