# Cách sử dụng server của trường Chào mọi người, bài viết này sẽ nhằm mục đích hướng dẫn mọi người cách dùng server DGX A100 của trường UIT để huấn luyện hoặc inference mô hình của mình nhé. Note: Để dùng được server, các bạn phải có tài khoản được cấp, cái này cô Hằng sẽ đưa cho các bạn nếu các bạn đã test code thành công trên máy của mình và muốn tăng tốc quá trình chạy bằng cách sử dụng GPU của server. Nếu các bạn lấy server để test code thì rất là phí và cũng phức tạp cho nên việc khi nào cấp tài khoản cho các bạn đều do cô Hằng quyết định. ## Điều kiện tiên quyết Để mà dùng và thao tác được trên DGX thì các bạn phải biết được ít nhất là một số khái niệm bên dưới đây nhé, nếu chưa quen thuộc cái nào thì mình khuyến khích nên xem qua rồi hẵn bắt đầu. - Biết sử dụng ***CLI*** (*command line interface*), hay quen thuộc nhất là ***terminal*** (window) và ***bashshell*** (linux). - Biết dùng (ít nhất ở mức cơ bản) ***Linux*** (hoặc ***Ubuntu***). - Biết ***ssh*** là gì. - Biết dùng VSCode (chà, cái này không hẳn là bắt buộc lắm, nhưng nếu biết thì sẽ rất tiện đấy). Tất nhiên là sẽ xuất hiện một vài thứ mới mẻ nữa, tuy nhiên mình sẽ giải thích nó trong quá trình các bạn đọc. So let's go! ## "Sử dụng server" tức là như thế nào? Trước tiên, mình muốn các bạn hình dung được việc "sử dụng server" nó cụ thể như thế nào. Là một game thủ kì cựu, ban đầu, mình tưởng tượng rằng sẽ có một màn hình đăng nhập, mình nhập tài khoản được cấp vào và sau đó là một interface gì đấy hiện ra để mình code và cho gpu nó chạy, như đăng nhập tài khoản game vậy:D. Tuy nhiên không phải vậy, chúng ta sẽ sử dụng thông server thông qua ***ssh***, tức là ta kết nối CLI của chúng ta vào CLI của server, sau đó thao tác y như trên máy của chúng ta vậy. ![Untitled](https://hackmd.io/_uploads/SkVSLzg6Je.png) Hình minh họa, mình đã dùng terminal (window) của mình để connect vào bash shell (linux) của server. Các thao tác tạo file, tạo folder, remove hay run code khi mình gõ trong terminal đều sẽ được thực hiện ở server hết. ## Tổng quan các bước để vào được server trường Mình sẽ outline theo thứ tự các bước cần thiết để vào được server trường, đừng lo nếu bạn không hiểu khi nghe qua lần đầu, tí nữa mình sẽ giải thích nó rõ hơn ở bên dưới: - Fake IP vào mạng trường - Setup ssh để đăng nhập vào server bằng VSCode cho tiện - Connect vào server - Cách run code - Các lưu ý **cực kì quan trọng** (sẽ bị khóa acc nếu làm gì đó ngoo ngok, đọc kĩ nhé mấy bạn iu :D) ## Fake IP vào mạng trường *Bước này là gì vậy?* Giải thích: mình không có hiểu biết nhiều về mạng máy tính, tuy nhiên để giải thích một cách đơn giản dễ hiểu thì chúng ta đang ở mạng bên ngoài trường và muốn connect vào server , và việc fake IP là một điều cần thiết khi muốn thực hiện điều này. Don't be serious, it's just a step to reach our goal. ### 1. Download OpenVPN Các bạn lên mạng, search OpenVPN và download nó về, đây là phần mềm giúp chúng ta fake IP. ![image](https://hackmd.io/_uploads/r1pBKGe6Jl.png) ### 2. Thiết lập file config OpenVPN sẽ yêu cầu chúng ta tải lên một file gọi là "config file", các bạn tải file này về và upload nó lên nhé. *Tìm file này ở đâu vậy?* Trả lời: liên hệ madam Duong Viet Hang for more details nhé các tình yêu :D. ![Untitled](https://hackmd.io/_uploads/ryznKzepyx.png) ### 3. Fake IP Sau khi upload file config lên rồi thì các bạn đăng nhập vào mạng trường, bấm vào nút mình khoanh đỏ trong hình để nó hiện ra chỗ nhập mật khẩu nhé. Again, mật khẩu liên hệ madam Duong Viet Hang :D. ![Untitled](https://hackmd.io/_uploads/r1D_9fxTkl.png) Sau khi hoàn thành thì nó sẽ hiện ra như bên dưới, các bạn đừng tắt mà hãy để nó chạy ngầm nha (cứ để đó): ![image](https://hackmd.io/_uploads/HkgbsGg6kg.png) --- ## Setup VsCode Ok, đã xong bước fake IP rồi, giờ các bạn hoàn toàn có thể ssh thẳng vào server mà thao tác. Tuy nhiên mình không hay làm vậy lắm vì thao tác trên terminal rất cực, mỗi lần chuyển folder hay di chuyển giữa các file gõ mỏi tay lắm, chúng ta tìm cách tiện hơn nhé:D. VSCode có một extension tên là Remote SSH (mình mở lên thì thấy có 3 cái extension lận, các bạn cứ cài hết đi, mình chả nhớ cụ thể là cái nào, hehe:D). ![Untitled](https://hackmd.io/_uploads/SkNN3flTJx.png) Extension này giúp chúng ta connect vào folder của server luôn, tức là thay vì làm việc trên terminal, giờ đây khi SSH vào server, bạn sẽ được chọn mở folder nào và giao diện khi làm việc trên server y như giao diện bạn code trên máy của bạn vậy. Xem hình ví dụ bên dưới nhé: ![image](https://hackmd.io/_uploads/HJ6QTzepJg.png) Để mà dùng SSH Remote thì cần một số bước linh tinh, tuy không phức tạp nhưng nếu trình bày ra thì khá là dài dòng, các bạn chịu khó xem video hướng dẫn ở [đây](https://www.youtube.com/watch?v=rh1Ag41J6IA) cho nó đầy đủ nha. --- ## Cách run code Tuy đã vào được server, nhưng để run code thì các bạn phải thông qua một thứ có thể tạm hiểu là "người quản lý job" - một chương trình quản lý tài nguyên. Hiểu đơn giản server là một nơi cung cấp tài nguyên cho các bạn dùng, nhưng nếu nhiều người dùng và không được quản lý (phân bổ tài nguyên, giới hạn thời gian chạy...) thì mọi người sẽ tranh giành tài nguyên với nhau và rất hỗn loạn. Do đó mọi người sẽ **không được phép** chạy code trực tiếp (mặc dù là hoàn toàn chạy được) mà phải nộp code lên "người quản lý", chương trình này sẽ xem xét tài nguyên mà các bạn yêu cầu, đưa các bạn vào hàng đợi rồi sau đó sẽ chạy code cho các bạn. Bình thường, sau khi code xong các bạn sẽ run file code bằng cách gọi ```python main.py``` chẳng hạn, tuy nhiên để nộp lên "người quản lý", các bạn phải gói nó trong một file như bên dưới đây. Khi các bạn nộp một file này lên, nó sẽ được phân bổ tài nguyên để chạy, một lần nộp file này được gọi là 1 job (nộp như thế nào thì cứ xem từ từ): ``` #!/bin/bash #SBATCH --job-name=ten_job #SBATCH -o /data/cndt_hangdv/YOWOv3/out/output.txt #SBATCH --gres=gpu:1 #SBATCH --mem-per-gpu=30G #SBATCH -N 1 #SBATCH --ntasks=1 #SBATCH --ntasks-per-node=1 source /data/cndt_hangdv/LAB/YOLOKAN/myenv/bin/activate python main.py ``` Tức là các bạn phải tạo một file có đuôi ".sh" có nội dung như trên. Mình sẽ giải thích các thành phần trong file ngay bên dưới đây: 1. Dòng ```source /data/cndt_hangdv/LAB/YOLOKAN/myenv/bin/activate``` là mình đang activate env của mình, các bạn có thể dùng conda (nhớ tạo từ trước, tạo env thì cứ dùng CLI như bình thường, vì đây là task nhẹ, không cần tạo file phức tạp như trên). 2. Dòng ```python main.py ``` là để mình chạy code của mình, tất nhiên các bạn có thể thêm vào bất kì cái gì các bạn muốn chạy thêm, ví dụ ```python hack_sap_UIT.py``` chẳng hạn. 3. Nhớ thêm dòng ```#!/bin/bash``` ở đầu file, đây là quy ước. 4. ```#SBATCH --job-name=ten_job``` là để các bạn đặt tên cho job của các bạn để phân biệt với job của người khác. 5. ```#SBATCH -o /data/cndt_hangdv/YOWOv3/out/output.txt``` là để chỉ định output của code sẽ được in ra ở đâu. Ví dụ bình thường lệnh ```print()``` sẽ in ra trên terminal của các bạn, tuy nhiên khi chạy job thì nó sẽ in ra file thay vì ra terminal. 6. ```#SBATCH --mem-per-gpu=30G``` tức là yêu cầu bộ nhớ VRAM tối thiểu cho job của bạn. 7. Các dòng khác ban đầu là để run multigpu và distributed, tuy nhiên do trường mình không cho dùng multigpu nên các bạn cứ ignore đi:D. Tất nhiên là còn nhiều config khác mà các bạn có thể tùy chỉnh, ask GPT nha các bạn yêu. ### Nộp job Sau khi có file ```job.sh``` như ở trên, các bạn chạy lệnh ```sbatch job.sh```, tức là nộp ```job.sh``` lên đó :D. - Để theo dõi job của mình đang ở trạng thái nào: đang ở hàng đợi hay đang chạy hay đang abcdxyz gì đó thì các bạn gõ: ```squeue -u $USER```, nếu các bạn không thấy job của các bạn vừa nộp thì có khả năng nó chạy xong (hoặc bị lỗi rồi out ra rồi đó). - Để cancel job đang chạy, các bạn gõ ```scancel job_id```, trong đó ```job_id``` là id của job của các bạn, tìm số id này bằng lệnh ```squeue``` như ở trên nha. Các lệnh trên phục vụ nhu cầu cơ bản, trong quá trình dùng thì bản thân mình không cần cái gì khác, tuy nhiên nếu muốn, các bạn có thể hỏi GPT để xem có thêm option nào phù hợp nhu cầu hay không. ## Các lưu ý cực kì quan trọng Nhớ đọc kĩ những điều bên dưới và lúc nào cũng phải nhớ trong đầu khi dùng server, các bạn nếu vi phạm sẽ khiến tài khoản bị ban đấy! - Các bạn để data vào thư mục ```data/cndt_hangdv``` và code trong đó luôn cũng được. Tuyệt đối không để ```home/cndt_hangdv``` vượt quá 30GB, nếu không sẽ bị khóa acc. - Lưu ý môi trường mà các bạn cài đặt rất nặng, có thể lên đến vài chục GB cho một env, cho nên tốt nhất là để nó trong ```data/cndt_hangdv``` luôn. - Như mình nói, mặc dù các bạn run code trực tiếp trên CLI mà không thông qua ```sbatch``` vẫn được thôi, nhưng đây là sai quy định, cực kì lưu ý. - Đừng có nghịch linh tinh, các bạn làm server sập là ăn đòn (bởi madam Duong Viet Hang, mình ko biết gì đâu, hehe:D).