---
# System prepended metadata

title: LAB MEETING紀錄與群聯計畫

---

## 群聯計畫
ZNS 指的是 "Zoned Namespace"，用於SSD空間管理方式。

傳統的 SSD 是以 Block的方式進行存儲，而寫入操作往往需要擦除整個塊，這種操作稱為「塊擦除」。然而，在實際應用中，寫入操作的工作負載可能導致某些塊頻繁地被擦除，這對於SSD的壽命和效能可能會產生不利影響。

Zoned Namespace 技術通過將SSD分為多個區域（Zones），每個區域包含多個連續的塊。每個區域內的塊可以按照連續的順序進行寫入，而不需要擦除操作。當整個區域內的塊都被寫滿後，該區域將被標記為「寫入封閉」，不再接受新的寫入操作。這樣的操作方式減少了塊擦除操作，有助於提高SSD的耐用性和效能。

Zoned Namespace 技術對於特定應用場景和工作負載可能特別有益，例如日誌記錄（logging）和大規模數據寫入等情況。然而，它也需要作業系統和應用程式進行相應的支援，以充分發揮其優勢。

總之，Zoned Namespace 技術是一種在記憶體領域中使用的技術，旨在優化固態硬碟的寫入操作，提高效能和耐用性。

MLP 代表多層感知器（Multilayer Perceptron），是一種常見的神經網路架構。多層感知器是一種前饋式神經網路，其主要特徵是由多個層次的神經元組成，每個層次都與上一層次的神經元相連。

多層感知器的基本結構包含三種類型的層次：

輸入層（Input Layer）： 這一層包含了神經元，每個神經元代表了輸入特徵的一個維度。例如，如果你正在處理圖像，每個像素可以是一個輸入特徵。

隱藏層（Hidden Layers）： 隱藏層是介於輸入層和輸出層之間的一個或多個層次。每個隱藏層都包含多個神經元，這些神經元的輸出會被餵給下一層的神經元。隱藏層的存在使得多層感知器能夠學習複雜的非線性關係。

輸出層（Output Layer）： 輸出層包含了神經元，每個神經元代表了模型的一個輸出。例如，在分類任務中，每個神經元可能代表一個不同的類別。

多層感知器通常具有權重（weights）和偏差（biases），這些參數用於調整每個神經元的輸入和輸出。訓練多層感知器涉及到通過反向傳播算法來調整這些參數，以最小化模型的預測與實際標籤之間的誤差。

MLP 可以應用於各種機器學習任務，例如分類、回歸和模式識別。然而，在處理複雜的問題時，可能需要更深的神經網路結構，這就導致了深度學習的興起，其中的深度神經網路（如卷積神經網路和循環神經網路）可以捕捉更高層次的特徵表示。

DL 推薦系統是指基於深度學習（Deep Learning，DL）技術所建立的推薦系統。推薦系統是利用電腦演算法和技術，為使用者提供個人化推薦的系統，其目的是根據使用者的興趣和行為，向他們推薦可能感興趣的物品，例如商品、文章、音樂、影片等。

傳統的推薦系統使用協同過濾、內容過濾等技術進行推薦，但隨著深度學習的發展，越來越多的研究開始將深度學習應用於推薦系統中，以提高推薦的準確性和個人化程度。

DL 推薦系統利用深度學習模型來學習使用者和物品之間的複雜關係，從而更好地理解使用者的興趣和行為。常見的深度學習模型包括但不限於以下幾種：

神經網路模型： 使用多層神經網路，如前饋神經網路或多層感知器，來學習使用者和物品的表示，以及它們之間的關係。這些模型可以學習出更抽象的特徵表示，從而更好地捕捉使用者的行為和偏好。

矩陣分解模型： 這類模型將使用者和物品表示為低維的向量，通過將使用者-物品交互建模為這些向量的內積來預測使用者對物品的評分或偏好。

深度神經網路模型： 如基於卷積神經網路（CNN）或循環神經網路（RNN）的模型，用於處理圖像、序列等類型的推薦問題。

自編碼器模型： 這些模型旨在學習資料的緊湊表示，從而減少噪音並揭示潛在的關係，可用於推薦任務。

注意力模型： 這些模型允許模型關注使用者行為序列中的不同部分，以更好地捕捉重要信息，從而提升推薦效果。

Transformer 模型： 像BERT和GPT這樣的Transformer模型在自然語言處理領域取得了顯著的成功，也被用於推薦系統中，特別是對文本數據進行推薦。

這些模型可以根據具體的任務和資料進行調整和組合，以建立更準確、個人化的推薦系統。然而，深度學習模型通常需要大量的資料和運算資源進行訓練，因此在設計 DL 推薦系統時，也需要考慮軟硬體協同設計，以實現快速和可擴展的訓練。


嵌入向量（Embedding Vector）是自然语言处理（NLP）领域中常用的概念之一，它是用来表示离散型数据（如单词、词汇）的低维实数向量。在NLP中，文字通常被表示为离散的标记，比如单词或字符，但是在进行机器学习和深度学习任务时，我们需要将这些离散的标记转换为连续的向量，以便计算机能够更好地处理和理解它们。

嵌入向量的主要思想是将每个离散的标记（如单词）映射到一个实数向量空间中的点，使得在这个向量空间中，具有语义相似性的标记在空间中也是相近的。换句话说，嵌入向量捕捉了标记之间的语义关系，使得相似的标记在向量空间中距离较近，从而使得模型可以更好地理解语义信息。

例如，在一个嵌入向量空间中，类似的单词（如"king"和"queen"）可能会有较近的向量表示，因为它们之间有一定的语义关系。这种表示使得机器学习模型能够更好地捕捉到这些语义关系，从而在NLP任务中表现更好。

嵌入向量通常通过预训练的方法得到，其中模型在大规模的语料库上学习将单词映射到向量。Word2Vec、GloVe和BERT等模型就是常见的用于学习嵌入向量的例子。这些预训练的嵌入向量可以作为神经网络等模型的输入，帮助提升模型在各种NLP任务中的性能。

### A swapping Behavior Analysis of Deep Learning Recommendation System Training ###
### ---------- ###
### 講稿 ###
### ---------- ###
**p3.** 

推薦系統被應用在許多場景，而為了得到更好的效能，系統所蒐集使用者與物品的相關訊息越來越大，隨之而來的是需要重新訓練模型以獲得更準確的預測結果，但記憶體使用量也隨之上升。
當記憶體需求大於 physical memory 上限時，系統會使用SWAP來置換SSD作為擴張。但主要時間受SSD影響，因為NAND比DRAM執行來的耗時。SSD內部任務也會造成時間影響因素之一，比如垃圾收集(Garbage collection)也會跟用戶搶奪I/O資源，導致性能下降。

**p4.**

DLRM擁有三個部分，頂端與底端的MLP層，主要用來獲得資料集的時間類的連續特徵。而EBT是用來處理離散特徵，將其轉換成連續的特徵以便深度網路神經來更好的學習。
而目前FB的DLRM模型參數已經達到1.2兆，其中的EBT佔據了記憶體上百GB~TB的大小，因此會OS很常需要使用SWAP來讓模型獲取所需資料。

**p5.**

Fig2.2中
***右邊***的NAND快閃記憶體晶片用來儲存Data。這些晶片分為多個存儲單元，通常是SLC, MLC, TLC，表示每個單元可以儲存位元數量。
***中間***有一個控制器晶片，負責管理和控制數據的存取和流動與排成。控制器還負責實現讀寫操作的I/O請求、GC任務、錯誤修復、block管理。
***下面***有 DRAM 被用作快取，以提高讀寫性能。
***左邊***有一個介面，通常使用SATA、NVMe（Non-Volatile Memory Express）與電腦連接，以實現高速數據傳輸。
GC任務?用於回收使用過的NAND BLOCK，他會先選擇一個有效page最少的block作為victim，複製有效page到一個新的block後，回收這個含有較多非有效page的block。

**p6.**

因為不同模型擁有不同的複雜度、記憶體限制也會影響總訓練時間以及I/O的多寡。
因此這裡使用48GB的模型在128G, 32G, 16G下做訓練來做比較。
可以發現16G跟32G為128G的5.54x, 2.44x
可以得出結論：記憶體不足時，訓練時間會上升

**p7.**

因為128GB不需要SWAP，所以只需要比較32與16的。
他們所產出的總I/O量為3~6TB。
在這裡他們也測試了R/W的Latency，一開始因為mem還無滿，但在25000秒後可以發現有上升的趨勢，這裡的R/W分別為100ms和1ms。

**p8.**

這裡開始分析了大量I/O的特性及原因，以便分析swap速度慢的原因，並且觀察GC的影響。
首先這裡介紹了他們使用的HW/SW
**但我這裡發現他沒有解釋他SSD的型號，前幾天群聯內部會議的時候所提到的問題會不會與這個有關?因為無法分辨他是多少比例的SLC/TLC**

**p9.**

這裡主要差異為M1擁有64浮點數，M2有128的浮點數，導致整體模型複雜度為2倍。
而EBT占了90%

**p10.**

這裡介紹他使用的分析工具，
Cgroup是用來限制process使用資源的功能，比如說在特定core上運算、CPU時間。這裡使用其來限制總記憶體的DRAM容量
BLKTRACE為記錄kernel內部bio層的狀態工具，可以監控I/O量、延遲、大小、產能、要求
而BIO層是送往儲存裝置的最基本資料結構

**p11.**

存取模式與利用率
為了找出I/O量如此巨大的原因，所以來分析DLRM的存取模式以及page的利用率。
前述模型提到的多個EBT中，前五大的EBT佔了97.8%，因此觀察這***五個EBT就可以分析整個模型***

**p12.**

這裡他們發現每個EBT的虛擬位址是連續性的，但不同的EBT並不一定是連續性的。
因此開始分析這裡的space locality。
只要有頁面的向量被同一批access，就會算一次，
如果同時被access的vector越多，DLRM的space locality越好。
右下角的結果發現他的存取模式非常稀疏，只有3~5%的頁面會在一次批量處理中超過2個vector。
***可以得出結論：因此DLRM的space locality不強***

**p13.**

這裡開始分析實際的vector數量，方法為計算單一一個page中從swap in 到 swap out 所使用的vector總數，可以顯現頁面swap的利用率。
實驗結果發現利用率只有6~12%，
***而且右下角顯示MEMORY大小並無法決定利用率。
而是模型複雜度才會影響swap的利用率***

**p14.**

前面較低的利用率反應了一個結果，這意味著每個page利用率非常低，OS需要常常swap in out，導致巨大I/O量。
***因此這裡得到的結論為DLRM的access pattern非常的sparse，且page utilizationzo非常低。基於page的管理方式不適合DLRM的access pattern***

**p15.**

這裡開始分析I/O的行為。
因為前面提到的交換率很低，所以我們開始尋找原因是否為HW或SW的問題。
這裡提到的英文為
Q(queued), G(get requested), I(inserted), M(merged), D(issued), C(Completed), 
可以發現由D2C，也就是issued 給 SSD 到完成記憶體讀取的時間為耗時最長。
***因此這裡得到的結論為花費大量的時間等待SSD完成I/O的mission***

**p16.**

這裡開始分析I/O的數量。
因為M1 32G有較大記憶體的緣故，所以可以在cache 2/3 model,
但M1 16G 有記憶體限制， M2 32G有模型複雜度的限制，實驗結果發現只能cache 1/3 model。
因為memory滿了後需要找出victim page來做置換，置換時也會同時需要寫入才能讀取，R/W比例大約為1:1
***因此這裡得到的結論為SSD是DLRM訓練的瓶頸***

**p17.**

這裡開始分析I/O的數量，
倘若I/O請求大小夠大，就能增加SSD的internal parallelism
這是為甚麼呢 主要有三點

***減少讀取/寫入延遲***：較大的I/O request size可以減少讀取和寫入操作之間的切換時間，這有助於提高整體性能。較小的I/O request size可能需要更多的I/O操作，這會增加延遲，降低效能。

***內部數據傳輸***:SSD通常具有多個通道、多個芯片、多個NAND閘或多個佇列來實現內部並行處理。當I/O request size較大時，SSD可以更容易地將數據分發到多個內部單元進行處理，這樣可以同時處理更多的數據，提高吞吐量。

***降低控制器開銷***：每個I/O request都需要SSD控制器進行管理和處理。當I/O request size較小時，相對於數據傳輸本身，控制器的開銷可能變得更加明顯，這可能導致效能下降。較大的I/O request size可以減少控制器開銷的相對比例。

如果I/O請求是短時間內發出且連續的，那BIO會把他們merge起來成大I/O請求。
實驗中顯示有83%~96%的寫被合併、
而讀取只有1.2~2.4%，這是因為他們讀取大小皆為4K，其原因是先前提到的DLRM access pattern非常sparse，而寫入大多小於32K，不利於SSD internal parallelism
而因為非常sparse，page內有許多的slot是invalid的，因此寫入更容易合併。

***因此這裡得到的結論為大多數的R/W請求都小於32K***

**p18.**

這裡想分析在訓練期間，SSD的性能是否有變化，
剛開始SSD的throughput很高(2~3GB/S)，但當達到SSD容量滿時，
throughput就會下降。
而這裡分析的原因為剛開始擁有SLC加速，但因DLRM的寫入量>>>SLC的容量，
當滿了後就會改成TLC，會變慢。
然而SSD開始GC時，需要回收block來滿足連續寫入請求，因為GC會共用SSD的內部BUS，
所以間接性影響I/O產能，大部分降速到(40MB/S)
***因此這裡得到的結論SLC無法幫助DLRM訓練，而GC也會導致性能下降***


***那我這裡其實有想問了一下CHATGPT，
若都由SLC構成的SSD會比SLC與TLC構成的SSD來比較，由SLC構成的SSD會比較快，
但相對的價格很高。***

**p19.**

大多數情況下的SSD內controller的queue深度為5~8，因此在queue的等待時間不算長。
關於前天內部會議提到的問題，我問了一下CHATGPT。
我想他這裡的解釋是
一個core可執行一個thread，如果一個thread只丟出一個I/O請求，並且時間足夠短讓該thread無法藉在短時間內在前一個I/O執行完前的時間先丟出下一個I/O請求，8個core大多數都維持8個queue depth是蠻合理的。因為他這裡最後結論是寫分析為I/O request並不密集。

**p.20**

前面有提到當I/O寫入達到SSD上限時會使用GC來回收block，當GC結束後可以發現R/W會急速上升，因此可以使用夠大的SSD來降低GC效應所帶來的延遲。

**P.21**
a,b讀取的時間<寫入的時間
可以藉由95%信賴區間的時間來比對，a,c可以得知結論較小的MEMORY會有更長的延遲，
而且較小的MEMORY會有較多的I/O量，GC也越大，
***因此這裡得到的結論為較小的MEMORY中95%信賴區間的latency會增加是因為I/O大，GC多***

**P.22**
這裡論文中蒐集了RAW後的1,2,3,5,10,50個read請求，
當收集到的read要求上升，95%信賴區間的latency會變高，直到第10個。
可以觀察10跟50的95%信賴區間差異，因此一個寫入會影響10個後續的讀取請求。
***倘若當前的系統擁有較好的應用訊息，可以對I/O進行較好的排程，就能降低latency***

**P.23**
Fio模擬：
Fio是一個可以模擬I/O的工具，他可以調整大小與讀寫的比例，在這裡實驗觀察throughput的變化。
這裡將寫入的大小比例設定為128K與4K，而讀取大小與DLRM原先比例相同。
而這裡也先將SSD以隨機填值而來模擬SWAP的步驟。
而這裡實驗結果其實與前述4.13的結果相符，整體R/W的bandwidth為22.8~28.1 (MB/S)

**P.24**
測試了不同的I/O大小，可以觀察無論R/W都可以得到結論為，
I/O請求大小越大可以帶給我們更高的bandwidth，
並且與P22比起來，setting1 與 setting2 的I/O request平均值為78.4, 41.2 
(皆大於32K)
但是整體bandwidth卻會小於只有單一大小請求的32K I/O request
且若I/O size越接近NAND PAGE的大小(16K)，
Internal parallelism就會降低
***因此這裡的結論為I/O REQUEST大小相同且大於NAND PAGE的大小效能更好***

**P.25**
順序寫入與隨機寫入會大幅度影響page中invalid/valid的比例，導致GC時間的不同。
這裡發現設置1(比對先前隨機寫入)讀取快了倍率2.78、寫入提升4.37
設置4是只有128k的 I/O request，與先前差異了6.53與6.16倍
GC也會更容易回收可用的BLOCK，因為隨機寫入會分散可用BLOCK，
而且GC會依據
且GC可用的空間也會因為連續頁面更多
***因此這裡的結論順序寫入為GC提升效率而提升性能***

**P.26**
第一：
使用更大的I/O request 並且使用順序寫入。
當更大的I/O request可以提升bandwidth，
提升了bandwidth就可以提升internal parallelism與GC效率。
第二：
使用Open channel ssd or zns ssd
因為這兩個中的並沒有使用FTL(不使用位址轉換，可以主動指定位址分配)
可以安排自己的I/O任務以及減少GC的影響。
結論：
當physical memory 不足時，訓練時間會增長、I/O量大
原因為access pattern 很 sparse: 3~5% 使用大於2個vector，
page的換入利用率很低: 6~12%
也因為R/W為1:1，確認了SSD是DLRM訓練的瓶頸
throughput在SLC cache耗盡後下降，寫入量達到SSD容量後再次下降，而後受SSD的GC影響。
I/O分析則是使用更大的size以及使用順序寫入會可以減少GC影響以及獲得穩定的I/O延遲。
### 10/15Meeting
```python=
os.environ['MASTER_ADDR']=主機IP
os.environ['MASTER_PORT']=主機PORT
```
```shelll=
***shut down the firewall***
sudo systemctl stop firewalld
***shut down the firewall and keep it while reboot
sudo systemctl disable firewalld
***while running the program to verify whether it connect successfully***
telnet <IP> <PORT>
```
```shellscript=
#!/bin/bash
export GLOO_SOCKET_IFNAME=enp0s31f6  ///網卡資訊

    time python3 dlrm_s_pytorch.py \
        --arch-sparse-feature-size=16 \
        --arch-mlp-bot="13-512-256-64-16" \
        --arch-mlp-top="512-256-1" \
        --data-generation=dataset \
        --data-set=kaggle \
        --raw-data-file=./criteo-kaggle/origin_train.txt \ ///training_data
        --processed-data-file=./input/kaggleAdDisplayChallenge_processed.npz \
        --loss-function=bce \
        --round-targets=True \
        --learning-rate=0.1 \
        --mini-batch-size=2 \ //batch size 
        --print-freq=1024 \
        --print-time \
        --test-mini-batch-size=16384 \
        --test-num-workers=16 \
        --rank=1 \
        --world-size=2 \
        --dist-backend="gloo" \
        --debug-mode
pid=$(ps -au | grep -m 1 blktrace | awk '{print $2}')
#kill -2 $pid

```
```shell=
in server1
real 0m55.384s
user 3m1.492s
sys 0m2.996s
```
```shell=
in server2
real 0m53.339s
user 3m0.926s
sys  0m2.715s
```

### 10/18Meeting
blktrace教程：https://blog.csdn.net/QTM_Gitee/article/details/126928506
Write the shell script to manipulate the queue of usage in SSD of disk.
```shell=
#!/bin/bash

# 設定監控時間間隔（秒）
interval=10

# 設定監控持續時間（秒），或者可以根據需要設定為無限循環
duration=3600

# 設定輸出文件的路徑
output_file="iostat_output.txt"

# 開始執行iostat並將輸出重定向到文件
iostat -x $interval $((duration / interval)) > "$output_file" &

# 取得iostat的進程ID
iostat_pid=$!

# 開始執行Python執行檔，假設它的名稱為your_python_script.py
python your_python_script.py

# 等待Python執行檔完成
wait

# 終止iostat進程
kill $iostat_pid
```
### 10/19Meeting
1.改寫成data generator
2.測試一下 小資料集上的
單機訓練時間是否>雙機訓練時間
3.跑小資料集的雙機BLKTRACE

### 10/22Experiment
```shell=
single machine
### with preprocessing
real 0m29.097s
user 0m53.966s
sys  0m2.159s

###without preprocessing
real 0m11.629s
user 0m38.735s
sys  0m1.912s
```
```shell=
double machine in distributed training system with small dataset
###with preprocessing
\\\host machine
real 0m51.507s
user 2m58.407s
sys  0m2.912s

\\\another machine
real 0m50.190s
user 2m58.895s
sys  0m2.677s

###without preprocessing
\\\host machine
real 0m38.417s
user 2m44.658s
sys  0m2.613s

\\\another machine
real 0m35.617s
user 2m44.101s
sys  0m2.592s

```


```shell=
hyperparameter:
11GB Dataset
epoch = 1
workers = 12 
lr = 0.1
loss = bce
```
```shell=
double machine in distributed training system with large dataset
###without preprocessing
\\\host machine
real 4m23.454s
user 4m30.993s
sys  0m22.321s


single machine
###without preprocessing
real 0m8.403s
user 0m36.462s
sys  0.396s
```

### 10/23群聯月會
2.鑒於先前建沂提到的 VM 環境問題，因此我們建立一個實體機的研究環境。
而這是我們的硬體設備環境，
相較於先前的VM，目前的硬體設備的記憶體空間較小，為原先的1/7。我們想實驗是否可以依賴較小的記憶體與較快速的SSD去加速模型訓練時間。

3.我們分別使用大小資料集在雙機與單機上訓練，而這兩個表格為訓練時間的結果。
可以發現目前為止單機訓練時間比雙機快，並且我們也在實驗時發現，
在大資料集狀況下，大部分的時間都是專注於data preprocessing。因此我們特別拿出來做比較，
而data preprocessing部分實驗數據會在下次月會報告。

4.那我們日後的實驗都會著重於在實體機上進行，
並且我們想要增加epoch數量去增加模型複雜度，
用來儲存更多模型所需要的參數。
另外會研究 pytorch framework裡面的 dataloader, datagenerator API ，
這兩個部分主要的功能都是減少記憶體的負擔成本，
可以實現在記憶體不足存取整體訓練資料實仍然可以將資料分批load進memory，
一個是用於training一個是用於preprocessing。
我們會往這兩塊去看他們的實作對於分散式I/O的影響。 
因為這兩塊是Pytorch裡面原本的功能，
那麼之後的研究可能就不會限於DLRM，我們可能會多方面的嘗試不同Model
**Q&&A**:
Data Generator, Data Loader 是否會有不同sequential造成不同的efficiency?
Searching for the answer.
### predo List
copy dataset to SSD //already done
set dataset path in python code 
11GigaBytes dataset之preprocessing training time.
training time of epoch = 1 and 100
blktrace and iostat of SSD


### 11/18 改成分開儲存.npz檔案
```python=
 for counting in counts_generator(d_path, d_file):
            print("start counts")
            if os.path.exists(d_path + o_filename + "test" + ".npz"):
                np.savez(d_path + o_filename + "test" + ".npz",
                     counts = counting,
                     allow_pickle=True,
                     append=False)
            else:
                np.savez(d_path + o_filename + "test" + ".npz",
                     counts = counting,
                     allow_pickle=True,
                     append=True)
for i in range(7):
    for X_cat, X_int, y in data_generator(i, npzfile, d_path, d_file, batch_size):
        print("start Xcat Xint Y")
        print(d_path + o_filename + "test" + ".npz")
        print(X_cat.shape, X_int.shape, y.shape)
        np.savez(d_path + o_filename + "test" + ".npz",
                X_cat=X_cat,
                X_int=X_int,
                y=y,
                allow_pickle=True,
                append=True)
        print("finish!")
```
### 11/20 突然想到
去NCKU後，CCU的VPN帳號???how to access the server in the lab
VM現在是有問題嗎？我只要連5分鐘就會斷線一次QQ
![image](https://hackmd.io/_uploads/Sk1hmRFV6.png)



![image](https://hackmd.io/_uploads/HkvhaCtEa.png)


### 12/5:
![image](https://hackmd.io/_uploads/rkpkuT3Ba.png)


![image](https://hackmd.io/_uploads/ry85CyaS6.png)


### 網路設定:
啟用網卡：
如果網卡處於停用狀態，啟用它：
bash
sudo ip link set dev eth0 up
請確保替換 eth0 為你的實際網卡名稱
新增 IP 和子網遮罩：
假設你要新增 IP 地址 192.168.1.2，子網遮罩 255.255.255.0：

bash
sudo ip addr add 192.168.1.2/24 dev eth0
請將 eth0 替換為你系統中的實際網卡名稱。

新增網關：
假設你要新增網關 192.168.1.1：

bash
sudo ip route add default via 192.168.1.1

新增DNS

bash
sudo resolvectl dns enp0s31f6 140.123.1.100


### 12/6Meeting:
blktrace 抓 進去硬碟前的log分析


ssd problem:
1.買新的SSD
2.清掉?
==>SSD型號?(為了知道是哪顆)
清掉(?)
查一下可不可以使用linux的指令


### 12/12:

```shell=
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-6.2.0-37-generic root=/dev/mapper/vgubuntu-root ro lockdown=0 quiet splash vt.handoff=7
[    0.000000] Malformed early option 'lockdown'
[    0.000000] Kernel is locked down from EFI Secure Boot mode; see man kernel_lockdown.7
[    0.023481] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-6.2.0-37-generic root=/dev/mapper/vgubuntu-root ro lockdown=0 quiet splash vt.handoff=7
[    0.073457] LSM: initializing lsm=lockdown,capability,landlock,yama,integrity,apparmor
[    0.608671] Lockdown: swapper/0: hibernation is restricted; see man kernel_lockdown.7
[    3.797355] Lockdown: systemd: /dev/mem,kmem,port is restricted; see man kernel_lockdown.7
[   64.950599] Lockdown: systemd-logind: hibernation is restricted; see man kernel_lockdown.7
[ 5649.930331] Lockdown: blktrace: debugfs access is restricted; see man kernel_lockdown.7

```
CHATGPT
```
取消 Secure Boot 模式通常需要在系統的 UEFI/BIOS 設置中進行。以下是一般步驟，請注意這些步驟可能會因製造商和型號而異：

進入 UEFI/BIOS 設置：

通常，在開機時按下或長按 DEL、F2、F10、F12 或 ESC 鍵可以進入 UEFI/BIOS 設置。這取決於你的電腦製造商。
尋找 Secure Boot 選項：

在 UEFI/BIOS 設置中，尋找類似 "Secure Boot" 或 "UEFI Secure Boot" 的選項。
禁用 Secure Boot：

進入 Secure Boot 選項後，將其設置為 "Disabled" 或 "Off"。
保存並退出：

在設置更改後，請保存並退出 UEFI/BIOS 設置。
重新啟動系統：

在重新啟動系統後，確保你的系統不再處於 Secure Boot 模式。
請注意，取消 Secure Boot 可能會影響系統的安全性，因此建議在進行此操作之前了解相關的風險。此外，某些操作可能需要管理員權限或密碼。

如果你無法找到相關的 Secure Boot 選項，建議查閱你電腦的製造商手冊或在網上搜索相應的步驟。每個製造商的 UEFI/BIOS 設置略有不同。
```
網路:
```
看起來你的系統正在使用 systemd，這是現代 Linux 系統中的一個常見初始化系統。對於自動設定 IP 地址、子網遮罩、網關和 DNS，你可以使用 systemd-networkd 服務。以下是配置的步驟：

創建一個 .network 文件，用於定義你的網絡配置。這裡假設網絡接口為 eth0。請根據你實際的網絡接口名稱進行調整。

bash
Copy code
sudo nano /etc/systemd/network/eth0.network
在 .network 文件中添加以下配置。請替換 <ip_address>, <subnet_mask>, <gateway_address>, <dns_address> 為你實際的數值。

plaintext
Copy code
[Network]
Address=<ip_address>/<subnet_mask>
Gateway=<gateway_address>
DNS=<dns_address>
例如：

[Network]
Address=192.168.1.2/24
Gateway=192.168.1.1
DNS=8.8.8.8
保存文件並退出。

重新啟動 systemd-networkd 服務以應用新的配置：

bash
Copy code
sudo systemctl restart systemd-networkd
這樣就完成了對於 systemd-networkd 的配置。請確保配置的信息是正確的，以避免網絡連接問題。
```


### 12/14Meeting:
blktrace intro:https://developer.aliyun.com/article/698568


windows OS 分區 
==>host已刪除 尚未重新開機
==>server2 尚未刪除 尚未重新開機
自動化啟用網卡
```shell=
cat /etc/netplan/01-network-manager-all.yaml
sudo vim /etc/netplan/01-network-manager-all.yaml
```
ip address 需更換: 
server host :140.123.103.13
server 2    :140.123.103.11
```vim=
network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s31f6:
      dhcp4: no
      addresses:
        - 140.123.103.13/24
      routes:
        - to: 0.0.0.0/0
          via: 140.123.103.250
      nameservers:
        addresses: [140.123.1.100] 
```
```shell=
sudo apt-get install netplan.io
sudo chmod 600 /etc/netplan/01-network-manager-all.yaml
sudo netplan apply
```
再來就是重新開機測試是否開機自動啟用網卡成功

```shell=
sudo blktrace -w 1000 -d /dev/mapper/vgubuntu-root -o - | blkparse -i - -d vgubuntu-root
\\blktrace:
\\ -w -1000: 1000S
\\ -d : device
\\ -o -: stdout output
\\blkparse:
\\ -i -: stdin input
\\ -d : output file name
```

### 實驗執行順序:
先啟用blktrace，在host端執行dlrm_multi.sh，在server2執行dlrm_multi.sh。
若shut down，需要去./criteo....中，執行./rmFile.sh刪除產生的preprocessing file



### 12/14 data preprocessing in small dataset:
```shell=
btt -i vgubuntu-root -l vgubuntu-root_latency
```

![image](https://hackmd.io/_uploads/BJYBGBdI6.png)

![image](https://hackmd.io/_uploads/rJxIzSuIT.png)

btt命令的輸出，該命令用於在Linux中測量塊I/O（輸入/輸出）延遲。
輸出顯示了不同塊I/O操作階段的延遲統計信息。以下是信息的詳細分解：
所有設備部分：

Q2Qdm：完成整個I/O請求所需的時間（從提交到完成）。
Q2Cdm：將I/O請求提交到存儲層直到I/O完成所需的時間。
對於每個指標（MIN、AVG、MAX、N），它提供了所有設備的值。

設備開銷部分：

Q2G：將I/O請求排隊在塊層直到到達存儲層所需的時間。
G2I：在存儲層中的I/O請求開始處理（I/O開始）所需的時間。
Q2M：將I/O請求提交到存儲層直到開始處理所需的時間。
I2D：將I/O請求處理到標記為存儲層完成所需的時間。
D2C：將I/O請求標記為存儲層完成直到到達塊層所需的時間。

這些指標提供了有關I/O操作不同階段的洞察。
對於每個指標，它顯示了所有設備的值。這些值包括最小（MIN）、平均（AVG）和最大（MAX）延遲，以及樣本數（N）。
這些信息對於診斷系統上與磁盤I/O相關的性能問題可能很有用。如果你有具體問題，或者有特定方面需要更多信息，請隨時提問！

![image](https://hackmd.io/_uploads/Bkt8GB_Ip.png)

![image](https://hackmd.io/_uploads/Hk1uzH_IT.png)

training risk to fix:

![image](https://hackmd.io/_uploads/BJJ94HdU6.png)

圖示化blktrace的mbps與iops:
使用gnuplot套件。
```shell=
vim plot.gp
```
配合更改blktrace所產出的file name
```vim=
set terminal png
set output 'output.png'

set title 'I/O Performance'
set xlabel 'Timestamp'
set ylabel 'MBps/IOPS'

plot '253,0_mbps_fp.dat' using 1:2 with lines title 'MBps', \
     '253,0_iops_fp.dat' using 1:2 with lines title 'IOPS'
```
再使用
```shell=
gnuplot plot.gp
```
產生了output.png

![image](https://hackmd.io/_uploads/Sks_nUu8T.png)

blktrace的blkiomon指令可以產生各階段的 histogram


### 1/12:
host:
![image](https://hackmd.io/_uploads/ryh0shAOp.png)

![image](https://hackmd.io/_uploads/HyuJ23CdT.png)

server2:
![image](https://hackmd.io/_uploads/Sypbh30_T.png)

![image](https://hackmd.io/_uploads/r1wG33CO6.png)



### 2/20:
3.7GB
![image](https://hackmd.io/_uploads/SJW8VTW3a.png)

![image](https://hackmd.io/_uploads/rktLEa-2T.png)


![image](https://hackmd.io/_uploads/r1rkSp-nT.png)

## source code:
https://github.com/facebookresearch/dlrm/tree/main


## Meeting Video
https://youtu.be/9YSiixl_V8A

### ToDoList

sequential shuffle 投影片在p.1之前(先前做過的投影片) done
前情提要 dlrm + blktrace done
這時間伺服器跟訓練上的所有問題 
硬體設備比較表格 done
資料集差異 done
3.7GB斷電 done
結果分析(硬體設備) done