我們在進行Linux作業時, 常常會撰寫一些腳本來進行我們的任務, 而我們執行任務當下假如沒有將當時的參數紀錄起來常常事後追朔時很容易就遺漏掉, 尤其是在AI模型訓練這一塊, 每次的訓練都是好幾個小時甚至好幾天⏱️⏱️⏱️, 我們常常會需要對模型訓練的參數與結果進行分析, 那麼蛛絲馬跡就非常重要了, 因此我們在做任何行動之前最好都留下點證據, 以免難以追朔導致成本上的浪費。
Bash腳本常常幫助我們將一系列連續技的指令組合起來, 但模型訓練的過程中無非就是資料準備再到模型訓練, 且模型訓練的那個步驟非常重要, 我們腳本隨時會因為需求進行調整, 假設沒有良好的版控機制或者是LOG紀錄, 那會非常的難以追朔, 因此我們總會希望在進行「模型訓練」之前將當時參數進行快照儲存下來, 但又希望將過程印在螢幕上, 究竟應該怎麼做呢? 就讓我們繼續看下去吧!
將程式執行的LOG都寫到檔案(僅寫入檔案不輸出在螢幕上)
echo "log" > log.txt
顯示於螢幕之外也寫入檔案
echo "log"| tee log.txt
顯示於螢幕之外也累加到既有檔案之後
echo "log1"| tee -a log.txt
stdout 和 stderr 皆輸出
# 這部分是一個重定向操作符號。
# 在這裡,2 表示標準錯誤流(stderr),
# 1 表示標準輸出流(stdout),
# >& 表示將標準錯誤流重定向到標準輸出流。
# 簡而言之,這個部分將錯誤輸出合併到標準輸出流中。
echo "log" 2>&1 | tee log.txt
假設我們有一個模型訓練的任務, 期望於執行的同時也順便記載成檔案形式的LOG, 那麼我們可以怎麼做呢?
首先當然要先設計一下LOG的寫入位置「train.log」囉! 再來會有一個command是關於模型訓練的部份, 接著我們運用前述的「tee」讓command執行並「tee」到寫log。
#!/bin/bash
# LOG的輸出路徑
log_file="./train.log"
# 訓練的指令與參數
command="./train.py --iter 100 --num_workers 24"
# 使用tee幫我們寫到檔案並印在螢幕上
$command 2>&1 | tee -a "$log_file"
Linux系統真是學無止盡…, 許多小技巧都需要不斷的翻閱、更新, 可能資訊領域的宿命就是如此, 時常需要與時代俱進, 不斷學習新知, 並且快速的應用於實務上, 但也因此讓我們思緒變得更快更靈活, 對於應對處事上也會有一定的幫助。