uri410's picture
Deploy NovelReader Translate Tool
abd39d3 verified
Raw History Blame Contribute Delete
5.14 kB
"""Tự động kiểm tra, tải và cài đặt PyTorch CUDA + thư viện cuBLAS 12 cho GPU (Colab T4 / Linux)."""
import os
import sys
import shutil
import subprocess
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(ROOT))
if hasattr(sys.stdout, 'reconfigure'):
sys.stdout.reconfigure(encoding='utf-8')
from translation.core.gpu_setup import (
choose_cuda_channel,
torch_install_command,
verify_torch_cuda,
verify_ct2_cuda,
install_torch_cuda,
_TORCH_CUDA_CHANNELS,
)
from translation.core.ct2_safe_import import preload_cuda_libraries
def get_driver_cuda() -> tuple[bool, str | None, str | None, float | None]:
"""Lấy thông tin GPU NVIDIA và CUDA version từ nvidia-smi."""
if shutil.which("nvidia-smi") is None:
return False, None, None, None
try:
header = subprocess.run(["nvidia-smi"], capture_output=True, text=True, timeout=10)
gpu_info = subprocess.run(
["nvidia-smi", "--query-gpu=name,memory.total", "--format=csv,noheader,nounits"],
capture_output=True,
text=True,
timeout=10,
)
except Exception:
return False, None, None, None
gpu_name = None
vram_gb = None
cuda_ver = None
if gpu_info.returncode == 0 and gpu_info.stdout.strip():
first_line = gpu_info.stdout.strip().splitlines()[0]
parts = [p.strip() for p in first_line.split(",", 1)]
gpu_name = parts[0]
if len(parts) > 1:
try:
vram_gb = float(parts[1]) / 1024.0
except ValueError:
pass
if header.returncode == 0:
import re
m = re.search(r"CUDA Version:\s*([0-9]+\.[0-9]+)", header.stdout)
if m:
cuda_ver = m.group(1)
return True, gpu_name, cuda_ver, vram_gb
def install_nvidia_libs_if_needed():
"""Đảm bảo các thư viện cuBLAS 12 và cuDNN đã được cài đặt trên Linux."""
if not sys.platform.startswith("linux"):
return
try:
import nvidia.cublas # noqa: F401
except ImportError:
print("📦 Đang tải và cài đặt thư viện runtime nvidia-cublas-cu12 & nvidia-cudnn-cu12...")
subprocess.run(
[sys.executable, "-m", "pip", "install", "-q", "nvidia-cublas-cu12", "nvidia-cudnn-cu12"],
check=False
)
def main():
print("=" * 65)
print("🚀 NOVELREADER — TRÌNH KIỂM TRA & KÍCH HOẠT GPU T4 / CUDA")
print("=" * 65)
has_gpu, gpu_name, driver_cuda, vram_gb = get_driver_cuda()
if not has_gpu:
print("❌ Không tìm thấy GPU NVIDIA vật lý qua nvidia-smi.")
print(" Nếu đang chạy trên Google Colab:")
print(" Vào menu: Thời gian chạy -> Thay đổi loại thời gian chạy -> T4 GPU -> Lưu.")
sys.exit(1)
vram_str = f"{vram_gb:.1f} GB" if vram_gb else "không xác định"
print(f"✅ Phát hiện GPU: {gpu_name} (VRAM: {vram_str})")
print(f"📌 CUDA Driver Version: {driver_cuda or 'N/A'}")
# 1. Cài đặt các gói thư viện cuBLAS 12 và cuDNN nếu là Linux (chứa libcublas.so.12)
install_nvidia_libs_if_needed()
# 2. Kiểm tra PyTorch CUDA hiện tại
torch_ok, msg = verify_torch_cuda()
channel = choose_cuda_channel(driver_cuda) or "cu124"
if torch_ok:
print(f"✅ PyTorch đã nhận GPU thành công: {msg}")
else:
print(f"\n⚠️ PyTorch hiện tại chưa hỗ trợ GPU: {msg}")
print(f"📦 Đang tự động tải và cài đặt PyTorch CUDA tương thích (kênh {channel})...")
success, res_msg = install_torch_cuda(driver_cuda, on_log=print)
if not success:
print(f"❌ Cài đặt PyTorch CUDA thất bại: {res_msg}")
sys.exit(2)
print(f"✅ {res_msg}")
# 3. Preload các thư viện CUDA (libcublas.so.12, libcublasLt.so.12) vào bộ nhớ tiến trình
preload_cuda_libraries()
# 4. Kiểm tra CTranslate2 CUDA
ct2_ok, ct2_msg = verify_ct2_cuda()
if ct2_ok:
print(f"✅ CTranslate2 CUDA: {ct2_msg}")
else:
print(f"⚠️ CTranslate2 chưa nhận CUDA: {ct2_msg}")
print(" Đang thiết lập cờ HACHIMIMT_FORCE_CT2_CUDA=1...")
os.environ["HACHIMIMT_FORCE_CT2_CUDA"] = "1"
# 5. Đánh thức GPU và kiểm tra tensor
try:
import torch
if torch.cuda.is_available():
x = torch.zeros((2048, 2048), device="cuda") @ torch.zeros((2048, 2048), device="cuda")
allocated = torch.cuda.memory_allocated(0) / (1024**2)
reserved = torch.cuda.memory_reserved(0) / (1024**2)
del x
torch.cuda.empty_cache()
print(f"🔥 Kích hoạt GPU Tensor thành công! (Allocated: {allocated:.1f}MB, Reserved: {reserved:.1f}MB)")
print("\n🎉 GPU T4 / CUDA ĐÃ SẴN SÀNG VỚI ĐẦY ĐỦ TÀI NGUYÊN!")
except Exception as exc:
print(f"⚠️ Lỗi khởi động tensor GPU: {exc}")
if __name__ == "__main__":
main()