GPU cho dự án của bạn · thanh toán crypto không cần KYC Cách thuê
Tiếng Việt
Mở console
Hướng dẫn thực hành / KERNODECK

PyTorch không nhận ra GPU: cần kiểm tra gì trước tiên?

Trước tiên hãy kiểm tra Python đang chạy chương trình của bạn, rồi đến gói PyTorch và backend của nó, tính khả dụng của GPU và cuối cùng là một phép tính nhỏ trên thiết bị đó. Chỉ nạp ứng dụng của bạn sau các bước kiểm tra này. Một lần import thành công, một card hiển thị trong công cụ hệ thống hay một phép tính CPU thành công không xác nhận cùng một bước.

15 phút đọc · Hướng dẫn cho nhà phát triển

Lộ trình chẩn đoán qua bốn quyết định

Mục tiêu là tìm ra lớp đầu tiên thất bại, chứ không phải thử lần lượt nhiều bản cài đặt. Hãy giữ lại lệnh đã chạy, thông báo lỗi đầu tiên và kết quả của từng bước kiểm tra. Nếu bạn thay đổi đồng thời Python, gói PyTorch và kích thước batch, bạn sẽ không còn biết thay đổi nào đã giải quyết vấn đề.

Script tải về áp dụng tiến trình này và tạo một báo cáo kỹ thuật có giới hạn. Nó không chạy mô hình của bạn và không thay đổi bản cài đặt của bạn. Hãy dùng nó trong cùng môi trường với dự án, nếu không bạn sẽ kiểm tra một trình thông dịch khác với trình đang gặp sự cố.

Cuộn bảng để xem tất cả các cột.
Dừng lại ở bước đầu tiên thất bại.
Kiểm traNếu kiểm tra thất bạiViệc vượt qua kiểm tra cho phép làm gì
1. Trình thông dịch và importSửa Python đang dùng hoặc bản cài đặt PyTorch của nó.Đọc phiên bản và backend của gói thực sự được import.
2. Backend và thiết bịXem xét gói, driver, việc GPU được hiển thị và các quyền.Yêu cầu cấp phát trên GPU mục tiêu.
3. Phép tính GPU nhỏGiữ lại lỗi cấp phát, tính toán hoặc đồng bộ.Chuyển sang đầu vào thu gọn của ứng dụng.
4. Ứng dụng đại diệnCô lập trọng số, tiện ích mở rộng, định dạng, bộ nhớ hoặc đầu ra sai.Tăng dần khối lượng công việc thực tế.

1. Xác định Python thực sự được chạy

Một terminal, một notebook và một dịch vụ có thể dùng các trình thông dịch khác nhau. Hãy in sys.executable trong ngữ cảnh chạy dự án, rồi kiểm tra phiên bản. Đường dẫn giúp phát hiện một môi trường ảo bị bỏ quên hoặc một notebook còn ở nhân khác. Hãy xem xét nó trên máy của bạn; không cần công bố cây thư mục cá nhân của bạn trong báo cáo.

Sau đó dùng chính trình thông dịch này để truy vấn các gói. Lệnh python -m pip show torch cung cấp thông tin về PyTorch gắn với Python đó. Nếu import torch thất bại, bước tiếp theo là sửa bản cài đặt đó: giảm batch hay đổi trọng số mô hình sẽ không giải quyết được một mô-đun bị thiếu.

Cần chạy trong cùng môi trường với dự án
python -c "import sys; print(sys.executable); print(sys.version)"
python -m pip show torch

2. Phân biệt CUDA, ROCm và gói không có tăng tốc GPU

Hãy ghi riêng torch.__version__, torch.version.cuda và torch.version.hip. Đừng kết luận "gói CPU" chỉ từ giá trị None của torch.version.cuda: PyTorch cho ROCm dùng HIP, tái sử dụng torch.cuda và cũng mong đợi một thiết bị có tên cuda. Thay tên đó bằng rocm hay hip không phải là cách sửa cần áp dụng.

Sau đó kiểm tra torch.cuda.is_available() và torch.cuda.device_count(). Những kết quả này mô tả những gì môi trường Python này có thể sử dụng tại thời điểm đó. Chúng không thay thế cho phép tính tối thiểu. Một công cụ hệ thống có thể thấy một card trong khi gói, trình điều khiển mà tiến trình truy cập được hoặc môi trường của nó khiến PyTorch không thể sử dụng card đó.

Đọc các chỉ số mà không cần nạp mô hình
python -c "import torch; print(torch.__version__); print(torch.version.cuda); print(torch.version.hip); print(torch.cuda.is_available()); print(torch.cuda.device_count())"

3. Tạo báo cáo bằng script Kernodeck

Sau khi tải tệp về, hãy đặt nó vào một thư mục làm việc và chạy nó bằng Python của dự án. Mặc định, nó yêu cầu một GPU. Chế độ CPU phải được yêu cầu rõ ràng: việc chạy thành công chỉ xác nhận nhánh CPU của chẩn đoán và không bao giờ biến một GPU không khả dụng thành GPU đã được xác nhận. Báo cáo được ghi ra terminal và, với --output, vào một tệp JSON mới. Tệp đã tồn tại sẽ không bao giờ bị ghi đè: hãy chọn tên khác cho lần thử tiếp theo.

Script cấp phát hai ma trận 2 × 2 kiểu float32, kiểm tra tích của chúng rồi đến gradient và đồng bộ thiết bị GPU. Giá trị loss mong đợi là 196 cho phép tính cố định này. Kiểm tra rất ngắn này không nạp trọng số mô hình nào và không đo bất kỳ thông lượng nào. Nó yêu cầu backend thực hiện một phép tính thực nhỏ, vượt ra ngoài việc chỉ phát hiện thiết bị.

Kiểm tra hệ thống tùy chọn sử dụng nvidia-smi khi có sẵn. Nó chỉ báo cáo phiên bản trình điều khiển NVIDIA và tổng bộ nhớ mà công cụ này nhìn thấy; nó không phải là kiểm tra hệ thống tương đương cho ROCm. Thời gian chờ của phép tính mặc định là 30 giây và có thể từ 5 đến 120 giây. Kiểm tra hệ thống có thời gian chờ tối đa riêng là 3 giây.

Kiểm tra GPU và lưu báo cáo
python kernodeck-diagnostic-v1.py --device-index 0 --timeout 30 --output diagnostic-gpu.json
Kiểm tra CPU được tách riêng có chủ đích
python kernodeck-diagnostic-v1.py --device cpu --output diagnostic-cpu.json
Thêm kiểm tra hệ thống NVIDIA tùy chọn
python kernodeck-diagnostic-v1.py --host-check --output diagnostic-gpu-systeme.json

4. Đọc báo cáo và chọn hành động tiếp theo

Bắt đầu với status, code, exit_code và stage. Khối runtime xác định phiên bản Python và họ hệ điều hành. Khối pytorch phân biệt gói được import, các phiên bản biên dịch CUDA/HIP của nó, backend được khai báo và các thiết bị nhìn thấy được. Khối execution cho biết phép tính thực sự diễn ra ở đâu và liệu tích cũng như gradient đã được xác nhận hay chưa.

Ở chế độ CPU, gpu_available và visible_device_count vẫn là null: script không truy vấn trạng thái trình điều khiển GPU. Đây không phải là số không cũng không phải là lỗi. Hãy đọc cả execution.device: một gói được biên dịch cho CUDA hoàn toàn có thể chạy kiểm tra này trên CPU khi được yêu cầu rõ ràng.

Báo cáo chứa một số dữ liệu kỹ thuật được chọn lọc. Nó không bao gồm các biến môi trường, đường dẫn trên máy, mã định danh phiên, danh sách đầy đủ các gói hay vết lỗi thô của ngoại lệ. Script không gửi báo cáo nào đến Kernodeck. Đối với lỗi chi tiết của ứng dụng, hãy giữ vết lỗi trong không gian làm việc của bạn và loại bỏ các thông tin bí mật trước khi chia sẻ.

Cuộn bảng để xem tất cả các cột.
Các mã hữu ích để quyết định bước tiếp theo; danh sách đầy đủ đi kèm với script.
Kết quảÝ nghĩaHành động tiếp theo
GPU_CHECK_PASSED · 0Tích và gradient đã được xác nhận trên GPU đã chọn.Chuyển sang một đầu vào nhỏ của ứng dụng.
CPU_CHECK_PASSED · 0Tích và gradient chỉ được xác nhận trên CPU.Không kết luận về CUDA hay ROCm.
TORCH_MISSING · 3 / TORCH_IMPORT_FAILED · 4PyTorch không có trong Python này, hoặc import thất bại.Kiểm tra trình thông dịch, gói và các phụ thuộc của nó.
GPU_BACKEND_ABSENT · 5Gói không khai báo CUDA lẫn HIP.Cài đặt gói phù hợp với môi trường của bạn.
GPU_UNAVAILABLE · 6 / DEVICE_INDEX_INVALID · 7GPU không dùng được trong tiến trình này, hoặc chỉ số nằm ngoài các thiết bị nhìn thấy được.Kiểm tra việc hiển thị các card, trình điều khiển và chỉ số được yêu cầu.
CHECK_FAILED · 8 / OUT_OF_MEMORY hoặc RUNTIME_ERROR · 9Phép tính cố định, cấp phát hoặc một thao tác backend thất bại.Đọc bước được báo trước khi chạy mô hình đầy đủ.
TIMEOUT · 10 / WORKER_FAILED · 11Kiểm tra bị dừng do hết thời gian chờ, hoặc không có báo cáo sử dụng được.Coi lỗi kiểm tra như một thất bại; xem xét môi trường.
OUTPUT_WRITE_FAILED · 12Báo cáo chưa được lưu vào đích đã yêu cầu.Dùng một tên tệp mới có thể truy cập được.

5. Từ phép tính nhỏ đến ứng dụng của bạn

Trước khi chạy, hãy chuẩn bị một lệnh có thể tái lập, một mô hình đã được xác định, một tập dữ liệu nhỏ và một thư mục đầu ra có thể truy cập được. Chọn một đầu vào giữ lại các đặc điểm quan trọng của công việc cuối cùng: độ dài văn bản, kích thước ảnh, định dạng âm thanh hoặc các trường bắt buộc. Một đầu vào ngắn một cách giả tạo có thể che khuất vấn đề mà bạn đang muốn quan sát.

Hãy viết một tiêu chí thành công cụ thể. Với phép tính embeddings, mỗi mã định danh đầu vào phải trả về một vectơ có số chiều như mong đợi, với các giá trị hữu hạn. Với huấn luyện, một bước phải tạo ra một loss dùng được, cập nhật các tham số dự kiến và cho phép lưu lại. Mã thoát của tiến trình bổ sung cho các kiểm tra này; nó không thay thế chúng.

Thêm các mốc đánh dấu trước và sau khi đọc tham số, import thư viện, nạp trọng số, chuẩn bị dữ liệu, chuyển dữ liệu, tính toán và ghi. Gán cho mỗi lần chạy một mã định danh và lưu lại các tham số đi kèm. Một thông báo « mô hình đã nạp » phải tương ứng với một sự kiện đã hoàn tất, chứ không chỉ là ý định nạp.

Ghi log hình dạng, kiểu và thiết bị của các tensor hữu ích mà không sao chép toàn bộ tập dữ liệu. Một bản tóm tắt như « đầu vào: 8 chuỗi, độ dài tối đa 512, thiết bị cuda:0 » giúp so sánh hai lần chạy. Các con số này ở đây mô tả một ví dụ log, không phải một cấu hình phổ quát. Tránh đưa token truy cập hoặc nội dung nhạy cảm của đầu vào vào các thông báo này.

6. Sửa lỗi ở đúng tầng

Nếu phép tính nhỏ chạy được nhưng không tìm thấy trọng số, hãy kiểm tra đường dẫn, định dạng và quyền truy cập của chúng. Nếu một extension import thất bại, hãy kiểm tra khả năng tương thích của nó với gói PyTorch và backend của dự án. Một chẩn đoán thành công không chứng nhận mọi extension của ứng dụng. Hãy quay lại bước đầu tiên thất bại thay vì thay đổi nhiều phụ thuộc cùng lúc.

Lỗi thiết bị có thể đến từ một đầu vào vẫn còn trên CPU trong khi mô hình ở trên GPU. Lỗi kiểu có thể đến từ một chuyển đổi cục bộ hoặc một toán tử không tương thích với độ chính xác đã chọn. Hãy giữ nguyên thông báo đầy đủ đầu tiên và traceback của nó. Chỉ thay đổi một giả định mỗi lần, rồi chạy lại đầu vào tối thiểu trước khi đưa trở lại khối lượng cuối cùng.

7. Nếu mô hình khởi động rồi vượt quá bộ nhớ

Xác định xem việc vượt bộ nhớ xảy ra khi nạp trọng số, ở phép tính đầu tiên hay sau nhiều vòng lặp. Những thời điểm này hướng tới các nguyên nhân khác nhau: mô hình quá lớn, activation hoặc cache sinh quá lớn, tích tụ các tensor được giữ lại. Ghi lại torch.cuda.memory_allocated() và torch.cuda.memory_reserved() tại cùng các bước. Cái thứ nhất theo dõi các cấp phát của tensor; cái thứ hai bao gồm bộ nhớ do allocator quản lý.

torch.cuda.empty_cache() có thể trả lại cache chưa dùng, nhưng không xóa các tensor vẫn còn được tham chiếu. Vì vậy hãy kiểm tra các danh sách đầu ra, lịch sử loss và các đối tượng đang giữ một đồ thị tính toán. Sau đó giảm batch hoặc độ dài đầu vào để cô lập yếu tố quyết định. Đổi card trở thành một quyết định có cơ sở khi bạn biết giai đoạn nào vượt bộ nhớ và mức dư thực sự cần thiết.

8. Đo phép tính mà không quên tính bất đồng bộ

Các thao tác GPU có thể bất đồng bộ so với chương trình Python. Do đó, một đồng hồ đo đặt quanh một lệnh gọi có thể chủ yếu đo thời gian gửi công việc. Để đo chẩn đoán, hãy đồng bộ GPU ở các ranh giới của đoạn được quan sát, hoặc dùng các event phù hợp. Việc đồng bộ này làm thay đổi diễn tiến: hãy giữ phần đo đạc này tách biệt khỏi hoạt động bình thường của ứng dụng.

Xây dựng một ví dụ đơn giản với ba phân đoạn: chuẩn bị đầu vào, tính toán, ghi đầu ra. Với phân đoạn GPU, gọi torch.cuda.synchronize(), ghi nhận time.perf_counter(), thực thi tính toán, đồng bộ lại, rồi tính hiệu số. Giữ riêng lần chạy đầu tiên và các lần sau. Việc nạp hoặc khởi tạo không được biến mất trong một giá trị trung bình được trình bày như thời gian phản hồi đầy đủ.

9. Kiểm soát đầu ra và giữ lại chẩn đoán có thể tái sử dụng

Với một suy luận thông thường, model.eval() điều chỉnh hành vi của các mô-đun liên quan, trong khi torch.inference_mode() vô hiệu hóa việc theo dõi cần thiết cho gradient. Hai thiết lập này có chức năng khác nhau. Dùng cái thứ hai khi các tensor được tạo ra không được tham gia sau đó vào một phép tính có gradient. Việc đánh giá mô hình trong quá trình huấn luyện đòi hỏi phải đặt lại rõ ràng đúng chế độ trước khi tiếp tục.

Bây giờ hãy so sánh đầu ra với hợp đồng đã chuẩn bị: số lượng kết quả, sự khớp của các định danh, kích thước, giá trị hữu hạn và chỉ số nghiệp vụ phù hợp. Nếu tăng batch, hãy kiểm tra lại sự khớp này. Nếu thêm GPU, hãy kiểm soát việc phân phối đầu vào và thu thập đầu ra. Lô thuê chỉ các card đã đặt; batch chỉ các mẫu được chương trình của bạn xử lý cùng nhau.

Kết quả của phương pháp này là một thư mục nhỏ: lệnh, phiên bản, tham số, đầu vào tối thiểu, bước thành công cuối cùng, lỗi đầu tiên, quan sát bộ nhớ và đầu ra thu được. Nếu lần chạy thành công, hãy giữ thư mục này làm điểm so sánh trước khi tăng tải. Nếu lần chạy thất bại, nó cho phép tái tạo vấn đề mà không phải bắt đầu lại toàn bộ quá trình điều tra.

Trước một xử lý dài, hãy cũng thực hiện một lần dừng sạch và tiếp tục trên tập đầu vào nhỏ này. Kiểm tra rằng các đầu ra đã ghi không bị mất cũng không bị đếm hai lần. Sau khi vượt qua các kiểm tra này, hãy tăng dần chỉ một trục — batch, độ dài, đồng thời hoặc số tiến trình — và ghi lại giới hạn quan sát được. Bạn có được một phạm vi hoạt động đã đo cho ứng dụng của mình, thay vì một phỏng đoán dựa trên tên GPU.

Bằng chứng được cung cấp và các giới hạn của nó

Các ví dụ có thể tải xuống được lấy từ những lần kiểm tra thực tế vào ngày 24 tháng 9 năm 2026. Hai lần chạy với PyTorch sử dụng Windows, Python 3.14.6 và PyTorch 2.11.0+cu128. Kiểm tra GPU dùng CUDA, trên một NVIDIA GeForce RTX 5070 ; kiểm tra CPU yêu cầu rõ ràng CPU. Phần cứng kiểm tra này không được xem là một ưu đãi của Kernodeck. Không có phép tính ROCm nào được chạy cho bằng chứng này.

Một phép tính nhỏ thành công cho thấy một đường dẫn cấp phát và tính toán hoạt động trên thiết bị đã chọn. Nó không đo tốc độ mô hình của bạn, cũng không đo bộ nhớ cần cho các đầu vào lớn nhất, cũng không đo khả năng tương thích với một tiện ích mở rộng cụ thể. Báo cáo cũng không chứng nhận một topology nhiều card. Hãy chuyển sang thử nghiệm đại diện trước khi quyết định tăng tải hoặc thuê.

Với một ứng dụng CUDA, hãy so sánh một thông số NVIDIA với nhu cầu bộ nhớ và thư viện của bạn; với một chuỗi ROCm, hãy xem xét các điều kiện của MI300X. Các thông số được liên kết là các lựa chọn cần đánh giá cho dự án của bạn, không phải danh sách phần cứng được dùng trong bằng chứng. Hãy giữ thời gian kiểm tra ban đầu và xuất trong khoảng 3, 7 hoặc 30 ngày của bạn.

Cuộn bảng để xem tất cả các cột.
Kết quả quan sát được của script v1.0.0; không có số liệu hiệu năng.
Kiểm tra thực tếKết quả quan sátPhạm vi
CPU rõ ràng · Python 3.14.6 / PyTorch 2.11.0+cu128CPU_CHECK_PASSED; tích và gradient chính xác; loss 196.Phép tính cố định hoạt động trên CPU.
CUDA · RTX 5070 / gói CUDA 12.8GPU_CHECK_PASSED; tích và gradient chính xác; loss 196.Phép tính cố định hoạt động trên card này trong môi trường này.
Thiếu PyTorch · Python 3.12.14TORCH_MISSING; mã thoát 3.Việc thiếu mô-đun tạo ra một lỗi rõ ràng.
GPU bị ẩn với tiến trình kiểm traGPU_UNAVAILABLE; mã thoát 6.Script không thay thế GPU bằng CPU một cách âm thầm.