Mặc dù Nvidia có hỗ trợ ép xung thông qua NVIDIA X Server Settings, nhưng nó đã không còn được cập nhật để hoạt động với Wayland. Quá chán nản khi phải chờ cập nhật, cộng đồng Linux đã tìm ra một giải pháp thay thế, đó là sử dụng thư viện NVML để ép xung.
Thư viện NVML chủ yếu hỗ trợ để chạy AI trên Linux và có interface để gọi bằng Python. Tuy nhiên trong bài này mình sẽ không đi sâu mà chỉ giới thiệu công cụ nvidia_oc, cách đơn giản và hiệu quả nhất để ép xung.
Cài đặt
Bạn có thể cài thông qua AUR
# fish
yay -S nvidia_oc
Sử dụng
Cách sử dụng cực kỳ đơn giản. Bạn có thể dùng các lệnh sau để xem hướng dẫn sử dụng
# fish
nvidia_oc -h
# A simple command line tool to overclock Nvidia GPUs using the NVML library on Linux. This supports both X11 and Wayland.
# Usage: nvidia_oc [OPTIONS] [COMMAND]
# Commands:
# set Sets GPU parameters like frequency offset and power limit
# get Gets GPU parameters
# completion Generate shell completion script
# help Print this message or the help of the given subcommand(s)
# Options:
# -f, --file <FILE> Path to the config file [default: /etc/nvidia_oc.json]
# -h, --help Print help
# -V, --version Print version
# fish
nvidia_oc set -h
# Sets GPU parameters like frequency offset and power limit
# Usage: nvidia_oc set --index <INDEX> <--freq-offset <FREQ_OFFSET>|--mem-offset <MEM_OFFSET>|--power-limit <POWER_LIMIT>|--min-clock <MIN_CLOCK>|--max-clock <MAX_CLOCK>|--min-mem-clock <MIN_MEM_CLOCK>|--max-mem-clock <MAX_MEM_CLOCK>>
# Options:
# -i, --index <INDEX> GPU index
# -f, --freq-offset <FREQ_OFFSET> GPU frequency offset
# --mem-offset <MEM_OFFSET> GPU memory frequency offset
# -p, --power-limit <POWER_LIMIT> GPU power limit in milliwatts
# --min-clock <MIN_CLOCK> GPU min clock
# --max-clock <MAX_CLOCK> GPU max clock
# --min-mem-clock <MIN_MEM_CLOCK> GPU min memory clock
# --max-mem-clock <MAX_MEM_CLOCK> GPU max memory clock
# -h, --help Print help
# fish
nvidia_oc get -h
# Gets GPU parameters
# Usage: nvidia_oc get --index <INDEX>
# Options:
# -i, --index <INDEX> GPU index
# -h, --help Print help
Ở đây tham số -i/--index là bắt buộc để xác định GPU Nvidia, quan trọng khi dùng nhiều GPU hoặc đang ở chế độ hybrid.
Để kiểm tra, ta dùng lệnh sau
# fish
nvidia-smi --query-gpu=index,name --format=csv
# 0, NVIDIA GeForce RTX 3060
# 1, NVIDIA GeForce RTX 6090
Ta thấy cột đầu tiên chính là index của GPU, cột thứ 2 là tên GPU.
Mình sẽ chọn card 0 là đối tượng ép xung lần này.
Trước tiên ta sẽ lấy thông tin của nó trước
# fish
nvidia_oc get --index 0
# GPU core clock offset: 0 MHz
# GPU memory clock offset: 0 MHz
# GPU power limit: 170 W
Sau đó từ từ tăng dần 2 thông số GPU core clock offset và GPU memory clock offset lên với bước nhảy thấp (khoảng 50-100MHz) và stress test.
Nếu xảy ra vấn đề thiếu hụt điện, bạn có thể tăng GPU power limit. Tuy nhiên một số GPU đời mới sẽ tự quản lý và khóa tính năng này nên không cần quá bận tâm.
# fish
nvidia_oc set --index 0 --freq-offset 100 --mem-offset 100
# Successfully set GPU parameters.
nvidia_oc get --index 0
# GPU core clock offset: 100 MHz
# GPU memory clock offset: 100 MHz
# GPU power limit: 170 W
glmark2 # stress test để đảm bảo GPU hoạt động ổn định
Nếu không có gì bất thường, có thể tiếp tục tăng dần
Giả sử sau n bước sẽ nhìn như này
# fish
nvidia_oc set --index 0 --freq-offset 250 --mem-offset 1400
# Successfully set GPU parameters.
nvidia_oc get --index 0
# GPU core clock offset: 250 MHz
# GPU memory clock offset: 1400 MHz
# GPU power limit: 170 W
glmark2 # stress test để đảm bảo GPU hoạt động ổn định
# fish
nvidia_oc set --index 0 --freq-offset 300 --mem-offset 2000
# Successfully set GPU parameters.
nvidia_oc get --index 0
# GPU core clock offset: 300 MHz
# GPU memory clock offset: 2000 MHz
# GPU power limit: 170 W
glmark2 # stress test để đảm bảo GPU hoạt động ổn định
Đến đây, trong khi stress test đã xảy ra tình trạng thiếu hụt điện, quá nhiệt,… và dẫn đến hiệu năng giảm, mình sẽ restore về lại cấu hình đã thành công trước đó:
# GPU core clock offset: 250 MHz
# GPU memory clock offset: 1400 MHz
Vì những thay đổi này chỉ là tạm thời nên khi khởi động lại máy sẽ tự reset về mặc định.
Ngoài ra, bạn cũng không nhất thiết phải test từng mức một mà có thể tham khảo preset có sẵn trên mạng.
Dù sao cách thực hiện cũng không quá khác biệt so với trên Windows.
Tự động ép xung khi khởi động
Sau khi tìm ra preset phù hợp và ổn định nhất trong đa số trường hợp, bạn có thể để nó ép xung mặc định khi khởi động, không cần phải tự chạy và sudo nữa.
Ví dụ:
cat /etc/systemd/system/nvidia_oc.service
# [Unit]
# Description=NVIDIA Overclocking Service
# After=network.target
# [Service]
# ExecStart=nvidia_oc set --index 0 --freq-offset 250 --mem-offset 1400
# User=root
# Restart=on-failure
# [Install]
# WantedBy=multi-user.target
Hướng dẫn chi tiết đã có trong docs của nvidia_oc, bạn có thể đọc nó tại đây