# Hướng dẫn Cài đặt Môi trường AI/ML trên AlmaLinux Toàn tập

Tài liệu này cung cấp một hướng dẫn toàn diện để thiết lập một server AlmaLinux cho các tác vụ huấn luyện và triển khai mô hình AI/ML, bao gồm cả các công cụ quản lý code, container hóa và hỗ trợ GPU.

## Bước 1: Cấu hình Hệ thống và Truy cập

Các bước ban đầu này giúp bạn thiết lập quyền truy cập và bảo mật cơ bản cho server.

1. **Cấu hình VS Code Remote SSH** Việc này cho phép bạn làm việc trực tiếp trên server từ VS Code ở máy tính cá nhân.
    
    - **Cài đặt Extension:** Trên VS Code, cài đặt extension "Remote - SSH".
        
    - **Cấu hình Remote:** Nhấn `F1` hoặc `Ctrl+Shift+P`, gõ "Remote-SSH: Connect to Host..." và chọn "Add New SSH Host...". Nhập `ssh <user>@<server-ip>` (ví dụ: `ssh mbsapp1@10.19.105.85`).
        
    - **Chỉnh sửa file cấu hình:**
        
        ```
        Host my-aiml-server
            HostName 10.19.105.85
            User mbsapp1
        ```
        
    - **Kết nối:** Chọn "Connect to Host..." và chọn `my-aiml-server`.
        
2. **Cài đặt VS Code Extensions trên Server**: **Cài đặt từ file `.vsix` (Khi máy client không có mạng)** Nếu máy client của bạn không có kết nối internet, bạn có thể cài đặt thủ công bằng cách sao chép file `.vsix` từ máy client sang server.
    
    - 1. **Lấy file `.vsix`:** Trên một máy tính có mạng, truy cập VS Code Marketplace, tìm extension bạn cần và tải về file `.vsix`.
            
        2. **Sao chép file lên server:** Sử dụng các công cụ như SCP (Secure Copy Protocol) hoặc các trình quản lý file qua SSH để chuyển file `.vsix` từ máy client lên server.
            
        3. **Cài đặt bằng dòng lệnh:** Trên terminal của server, chạy lệnh sau để cài đặt extension:
            
            ```
            code --install-extension <đường_dẫn_đến_file.vsix>
            ```
            
        
        Ví dụ: `code --install-extension ~/dbcode-1.2.3.vsix`
        
3. **Cấu hình `sudo` không cần nhập mật khẩu (Chi tiết)** Để không phải nhập lại mật khẩu `sudo` liên tục, bạn có thể cấp quyền đặc biệt cho người dùng.
    
    - **Lưu ý Quan trọng:** Thao tác này làm giảm đáng kể tính bảo mật của hệ thống. Chỉ nên thực hiện khi bạn là người duy nhất có quyền truy cập vào server và hiểu rõ rủi ro.
        
    - **Sử dụng `visudo`:** Bạn **phải** sử dụng lệnh `sudo visudo` để chỉnh sửa file cấu hình `sudoers`. Lệnh này sẽ mở file bằng một trình soạn thảo văn bản an toàn, giúp kiểm tra cú pháp trước khi lưu. Điều này ngăn ngừa các lỗi có thể khóa bạn khỏi quyền `sudo`.
        
        ```
        sudo visudo
        ```
        
    - **Chỉnh sửa file:** File `sudoers` sẽ được mở ra. Tìm đến cuối file và thêm dòng sau. Hãy chắc chắn thay `<username>` bằng tên user của bạn (ví dụ: `mbsapp1`).
        
        ```
        # Cho phép user chạy các lệnh sudo mà không cần nhập mật khẩu
        <username> ALL=(ALL) NOPASSWD: ALL
        ```
        
    - **Lưu và thoát:** Sau khi thêm dòng trên, bạn cần lưu file và thoát khỏi trình soạn thảo.
        
        - Nếu dùng `vi/vim` (mặc định): Nhấn `Esc`, sau đó gõ `:wq` và nhấn `Enter`.
            
4. **Đổi mật khẩu User** Sử dụng lệnh `passwd` để đổi mật khẩu user.
    
    ```
    passwd <username>
    ```
    

## Bước 2: Cài đặt Các Công cụ Phát triển Cơ bản

Đây là các công cụ nền tảng cho mọi dự án phần mềm, bao gồm cả AI/ML.

1. **Cài đặt Git** **Git** là công cụ quản lý phiên bản (version control) tiêu chuẩn, không thể thiếu để quản lý code.
    
    - Cài đặt Git:
        
        ```
        sudo dnf install git -y
        ```
        
    - Cấu hình thông tin người dùng:
        
        ```
        git config --global user.name "Tên của bạn"
        git config --global user.email "email@example.com"
        ```
        
    - **Kết nối đến GitLab** Để kết nối an toàn và tiện lợi với GitLab, bạn nên sử dụng khóa SSH.
        
        1. **Cấu hình thông tin người dùng cho GitLab:** Sử dụng email của bạn để đồng bộ với tài khoản GitLab.
            
            ```
            git config --global user.name "Dat Khong Tien"
            git config --global user.email "dat.khongtien@mbs.com.vn"
            ```
            
        2. **Tạo khóa SSH:** Sử dụng `ssh-keygen` để tạo một cặp khóa. Để trống các tùy chọn khi được hỏi để sử dụng giá trị mặc định.
            
            ```
            ssh-keygen -t ed25519 -C "dat.khongtien@mbs.com.vn"
            ```
            
        3. **Thêm khóa công khai (public key) vào GitLab:** Copy nội dung của file public key và dán vào phần cài đặt SSH Keys trên tài khoản GitLab của bạn.
            
            ```
            cat ~/.ssh/id_ed25519.pub
            ```
            
            Bạn có thể truy cập `User Settings > SSH Keys` trên GitLab để thêm khóa.
            
        4. **Kết nối bằng HTTPS (sử dụng Personal Access Token)** Đây là một phương pháp thay thế nếu bạn gặp vấn đề với xác thực SSH.
            
            a. **Tạo Personal Access Token (PAT) trên GitLab:** Truy cập `User Settings > Access Tokens` trên GitLab.
            
            - **Token name:** Đặt một tên dễ nhớ (ví dụ: `server-access-token`).
                
            - **Scopes:** Chọn quyền `read_repository` và `write_repository`.
                
            - Nhấn `Create personal access token`.
                
            - **Sao chép chuỗi token** được tạo ra.
                
            
            b. **Sử dụng token để clone project:** Khi clone, bạn có thể truyền token trực tiếp vào URL:
            
            ```
            git clone https://gitlab-ci-token:<your_personal_access_token>@gitlab.mbs.com.vn/data-platform/models/customer-risk-clustering.git
            ```
            
2. **Cài đặt Docker và Docker Compose** **Docker** là công cụ container hóa, giúp đóng gói ứng dụng và môi trường vào container để đảm bảo tính nhất quán khi triển khai.
    
    - Gỡ bỏ các phiên bản Docker cũ (nếu có):
        
        ```
        sudo dnf remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
        ```
        
    - Thiết lập kho lưu trữ Docker:
        
        ```
        sudo dnf -y install dnf-plugins-core
        sudo dnf config-manager --add-repo [https://download.docker.com/linux/centos/docker-ce.repo](https://download.docker.com/linux/centos/docker-ce.repo)
        ```
        
    - Cài đặt Docker Engine, CLI và các plugin:
        
        ```
        sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
        ```
        
    - Khởi động và kích hoạt Docker:
        
        ```
        sudo systemctl start docker
        sudo systemctl enable docker
        ```
        
    - **Dừng Docker:**
        
        ```
        sudo systemctl stop docker
        ```
        
    - Cấu hình user để chạy Docker không cần `sudo` (đăng xuất và đăng nhập lại để có hiệu lực):
        
        ```
        sudo usermod -aG docker mbsapp1
        ```
        
3. **Cài đặt Make** **Make** là một công cụ tự động hóa các tác vụ thường xuyên và lặp lại.
    
    - Cài đặt Make:
        
        ```
        sudo dnf install make -y
        ```
        

## Bước 3: Thiết lập Môi trường Python và Deep Learning

Đây là bước quan trọng nhất để chuẩn bị cho các tác vụ huấn luyện và triển khai mô hình.

1. **Cài đặt Python với `pyenv`** `pyenv` giúp quản lý nhiều phiên bản Python khác nhau trên cùng một hệ thống.
    
    - Cài đặt các gói phụ thuộc:
        
        ```
        sudo dnf install -y gcc openssl-devel bzip2-devel libffi-devel zlib-devel readline-devel sqlite-devel
        ```
        
    - Cài đặt `pyenv`: `curl https://pyenv.run | bash`
        
    - Thêm `pyenv` vào shell, sau đó `source ~/.bashrc`:
        
        ```
        export PATH="$HOME/.pyenv/bin:$PATH"
        eval "$(pyenv init --path)"
        eval "$(pyenv init -)"
        eval "$(pyenv virtualenv-init -)"
        ```
        
    - **Cài đặt các phiên bản Python** Để chuẩn bị cho các dự án trong tương lai, đặc biệt là khi server bị ngắt kết nối mạng, bạn nên cài đặt một số phiên bản Python ổn định khác.
        
        ```
        pyenv install 3.12.10
        # pyenv install 3.11.9
        # pyenv install 3.10.14
        # pyenv install 3.9.18
        ```
        
    - **Thiết lập phiên bản mặc định** Để sử dụng một phiên bản cụ thể cho dự án, bạn có thể thiết lập phiên bản Python mặc định bằng lệnh sau.
        
        ```
        pyenv global 3.12.10
        ```
        
2. **Cài đặt Trình điều khiển GPU, CUDA và cuDNN** Đây là các thành phần cốt lõi để chạy các mô hình deep learning trên GPU.
    
    - **Cài đặt Driver NVIDIA:**
        
        ```
        sudo dnf install [https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm](https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm)
        sudo dnf install nvidia-driver nvidia-settings -y
        ```
        
    - **Cài đặt CUDA Toolkit:**
        
        ```
        sudo dnf config-manager --add-repo [https://developer.download.nvidia.com/compute/cuda/repos/rhel8/x86_64/cuda-rhel8.repo](https://developer.download.nvidia.com/compute/cuda/repos/rhel8/x86_64/cuda-rhel8.repo)
        sudo dnf clean all
        sudo dnf install cuda -y
        ```
        
    - **Thêm CUDA vào PATH:** Thêm dòng sau vào `.bashrc` của bạn:
        
        ```
        export PATH=/usr/local/cuda/bin:$PATH
        export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
        ```
        
    - **Cài đặt cuDNN:** Tải file cuDNN từ trang web của NVIDIA và cài đặt thủ công.
        
3. **Cài đặt Thư viện AI/ML** ⚠️ **LƯU Ý QUAN TRỌNG:** Các thư viện dưới đây **nên được cài đặt trong môi trường ảo của dự án**, không phải môi trường global của hệ thống.
    
    Sử dụng `pip` hoặc `uv` để cài đặt các thư viện phổ biến.
    
    - **TensorFlow:**
        
        ```
        pip install tensorflow[and-cuda]
        ```
        
    - **PyTorch:**
        
        ```
        pip install torch torchvision torchaudio
        ```
        
    - **Các thư viện khác:** `uv pip install numpy pandas scikit-learn matplotlib jupyter`
        
4. **Cài đặt Các Công cụ Quản lý Thư viện** Để đảm bảo các công cụ quản lý thư viện hoạt động hiệu quả, hãy cập nhật `pip` trước tiên.
    
    - **Nâng cấp `pip`:**
        
        ```
        pip install --upgrade pip
        ```
        
    - `uv` (siêu nhanh): `pip install uv` --> `export UV_CACHE_DIR=/app/.uv-cache`
        
    - `poetry, poethepoet` (mạnh mẽ): `uv pip install poetry poethepoet --system`
        

## Bước 4: Quản lý Dự án và Môi trường

1. **Cấu hình `pyproject.toml` và Poe the Poet** Sử dụng `pyproject.toml` để quản lý dependencies cho cả môi trường training và serving. Thêm Poe the Poet (poe) để tự động hóa các tác vụ.
    
    - Cài đặt `poe` vào môi trường ảo của dự án:
        
        ```
        poetry add --group dev poethepoet
        ```
        
    - **Training:** Cần nhiều thư viện để huấn luyện.
        
    - **Serving:** Cần ít thư viện nhất để triển khai nhẹ nhàng.
        
    - **Ví dụ `pyproject.toml`:**
        
        ```
        [tool.poetry]
        name = "my-ml-project"
        version = "0.1.0"
        description = "Project for training and serving ML models."
        authors = ["Your Name <you@example.com>"]
        
        [tool.poetry.dependencies]
        python = "^3.12.10"
        fastapi = "^0.111.0"
        uvicorn = "^0.30.1"
        requests = "^2.3.2"
        psycopg2-binary = "^2.9.9"
        pyodbc = "^5.1.0"
        minio = "^7.2.2"
        redis = "^5.0.5"
        
        [tool.poetry.group.training.dependencies]
        numpy = "^1.26.4"
        pandas = "^2.2.2"
        scikit-learn = "^1.5.0"
        tensorflow = "^2.16.1"
        torch = "^2.3.1"
        matplotlib = "^3.9.0"
        jupyter = "^1.0.0"
        
        [tool.poe.tasks]
        train = "python -m my_project.train"
        serve = "uvicorn my_project.serve:app --reload"
        test = "pytest"
        
        ```
        
    - **Cách sử dụng:**
        
        - Cài đặt cho training: `poetry install --with training`
            
        - Cài đặt cho serving: `poetry install`
            
2. **Chuẩn bị Môi trường Offline** Tải tất cả các gói cần thiết vào một thư mục để cài đặt khi server ngắt kết nối mạng.
    
    - Tải gói: `uv pip download -r <requirements_file> -d offline_packages`
        
    - Cài đặt offline: `uv pip install --no-index --find-links=./offline_packages/ -r <requirements_file>`
        

## Bước 5: Các Công cụ Hữu ích cho Vận hành

1. **Jupyter Notebook/Lab** ⚠️ **LƯU Ý QUAN TRỌNG:** Tương tự các thư viện ở trên, Jupyter Notebook cũng **nên được cài đặt trong môi trường ảo của dự án** để tránh xung đột phiên bản và giữ môi trường hệ thống sạch sẽ.
    
    Một môi trường tương tác tuyệt vời cho việc khám phá dữ liệu và huấn luyện mô hình.
    
    - **Cài đặt:**
        
        - Nếu bạn đã **lỡ cài đặt Jupyter vào môi trường global**, hãy chạy lệnh sau để gỡ bỏ:
            
            ```
            pip uninstall jupyter notebook
            ```
            
        - Sau đó, hãy thêm `jupyter` vào file `pyproject.toml` và chạy `poetry install --with training` để cài đặt vào môi trường ảo.
            
    - **Cách chạy:** Để chạy trên server và truy cập từ xa, hãy chạy lệnh sau từ môi trường ảo:
        
        ```
        jupyter notebook --no-browser --port=8888 --ip=0.0.0.0 --allow-root
        ```
        
2. **Giám sát Hệ thống**
    
    - `htop`: Giám sát tài nguyên CPU và RAM. Cài đặt: `sudo dnf install htop -y`
        
    - `nvtop`: Giám sát tài nguyên GPU (cần có driver NVIDIA). Cài đặt: `sudo dnf install nvtop -y`
        

---

  

## Bước 6: Các Lệnh Linux Cốt lõi cho MLOps



Để quản lý và triển khai các dự án MLOps một cách hiệu quả, việc nắm vững các lệnh Linux là điều cần thiết. Dưới đây là các lệnh được nhóm theo chức năng, giúp bạn dễ dàng làm việc trên server AlmaLinux.

  
### 1. Quản lý File và Thư mục

|Lệnh|Chức năng|Ví dụ|
|---|---|---|
|`ls -al`|Liệt kê tất cả file và thư mục, bao gồm cả các file ẩn, với các thông tin chi tiết (quyền, kích thước, ngày sửa đổi).|`ls -al /home/mbsapp1`|
|`pwd`|In ra đường dẫn của thư mục làm việc hiện tại.|`pwd`|
|`cd <path>`|Thay đổi thư mục.|`cd /data-platform/models/`|
|`mkdir -p <path>`|Tạo một thư mục mới. Tùy chọn `-p` tạo cả các thư mục cha nếu chúng chưa tồn tại.|`mkdir -p /data/raw_data/`|
|`rm -rf <path>`|Xóa một file hoặc thư mục. **Cẩn thận khi sử dụng** vì lệnh này không thể hoàn tác.|`rm -rf /data/temp_models`|
|`cp -r <source> <dest>`|Sao chép file hoặc thư mục.|`cp -r model.pkl /data/`|
|`mv <source> <dest>`|Di chuyển hoặc đổi tên file/thư mục.|`mv data.csv new_data.csv`|
|`du -sh <path>`|Xem kích thước của một thư mục.|`du -sh /data/processed_data`|
|`find <path> -name "<name>"`|Tìm kiếm file hoặc thư mục trong một đường dẫn.|`find . -name "*.log"`|
|`grep <text> <file>`|Tìm kiếm một chuỗi văn bản trong file.|`grep "ERROR" my_app.log`|
|`head <file>`|Hiển thị 10 dòng đầu tiên của file.|`head data.csv`|
|`tail <file>`|Hiển thị 10 dòng cuối cùng của file. Rất hữu ích để xem log.|`tail -f my_app.log`|
|`touch <file>`|Tạo một file trống.|`touch new_script.py`|
|`chmod <permissions> <file>`|Thay đổi quyền truy cập của file hoặc thư mục.|`chmod +x run.sh`|

### 2. Quản lý Tiến trình (Processes)

|Lệnh|Chức năng|Ví dụ|
|---|---|---|
|`ps aux`|Liệt kê tất cả các tiến trình đang chạy trên hệ thống.|`ps aux`|
|`top`|Hiển thị các tiến trình đang chạy một cách tương tác, giúp bạn theo dõi tài nguyên CPU, RAM.|`top`|
|`htop`|Một phiên bản nâng cao và thân thiện hơn của `top`.|`htop`|
|`kill -9 <PID>`|Buộc một tiến trình phải dừng lại ngay lập tức. Thay `<PID>` bằng ID của tiến trình.|`kill -9 12345`|
|`nohup <command> &`|Chạy một lệnh trong nền, đảm bảo nó vẫn tiếp tục chạy ngay cả khi bạn đóng terminal.|`nohup python train.py &`|
|`jobs`|Hiển thị các job đang chạy trong nền của terminal hiện tại.|`jobs`|
|`journalctl -u <service>`|Xem nhật ký của một dịch vụ hệ thống.|`journalctl -u docker.service`|
|`systemctl status <service>`|Xem trạng thái của một dịch vụ.|`systemctl status postgresql.service`|
|`systemctl start <service>`|Khởi động một dịch vụ.|`systemctl start docker`|
|`systemctl restart <service>`|Khởi động lại một dịch vụ.|`systemctl restart nginx`|
|`systemctl stop <service>`|Dừng một dịch vụ.|`systemctl stop uvicorn`|

### 3. Quản lý Hệ thống và Mạng

|Lệnh|Chức năng|Ví dụ|
|---|---|---|
|`df -h`|Hiển thị dung lượng ổ đĩa.|`df -h`|
|`free -h`|Hiển thị dung lượng RAM.|`free -h`|
|`ping <hostname/IP>`|Kiểm tra kết nối mạng đến một máy chủ.|`ping google.com`|
|`netstat -tuln`|Liệt kê các cổng mạng đang lắng nghe.|`netstat -tuln`|
|`curl <url>`|Truyền dữ liệu đến hoặc từ một URL. Rất hữu ích để kiểm tra API.|`curl [http://localhost:8000/predict](http://localhost:8000/predict)`|
|`telnet <IP> <port>`|Kiểm tra kết nối đến một cổng cụ thể, rất hữu ích để debug network.|`telnet localhost 5432`|
|`mount`|Hiển thị các hệ thống file đang được gắn. Lệnh này hữu ích khi bạn cần truy cập vào một ổ đĩa hoặc phân vùng dữ liệu.|`mount`|
|`ss -tuln`|Xem socket mạng đang lắng nghe. `ss` là một công cụ hiện đại hơn `netstat`.|`ss -tuln`|
|`wget <url>`|Tải file từ internet.|`wget https://example.com/data.zip`|

### 4. Quản lý Gói và Cài đặt

|Lệnh|Chức năng|Ví dụ|
|---|---|---|
|`sudo dnf update`|Cập nhật tất cả các gói đã cài đặt.|`sudo dnf update`|
|`sudo dnf install <package>`|Cài đặt một gói phần mềm.|`sudo dnf install git -y`|
|`sudo dnf remove <package>`|Gỡ bỏ một gói phần mềm.|`sudo dnf remove git -y`|
|`dnf search <keyword>`|Tìm kiếm các gói có chứa từ khóa.|`dnf search "nvidia-driver"`|
|`dnf list installed`|Liệt kê các gói đã được cài đặt.|`dnf list installed`|
|`pip list`|Liệt kê các thư viện Python đã cài đặt trong môi trường ảo hiện tại.|`pip list`|
|`pip install <package>`|Cài đặt một thư viện Python.|`pip install numpy`|
|`pyenv virtualenv <name>`|Tạo một môi trường ảo Python mới.|`pyenv virtualenv 3.12.10 my_project_env`|
|`pyenv activate <name>`|Kích hoạt môi trường ảo Python.|`pyenv activate my_project_env`|
|`pyenv deactivate`|Hủy kích hoạt môi trường ảo.|`pyenv deactivate`|