diff --git a/backend/app/models/chronos.py b/backend/app/models/chronos.py index 7f660f6..328dacc 100644 --- a/backend/app/models/chronos.py +++ b/backend/app/models/chronos.py @@ -59,8 +59,22 @@ def _load() -> None: os.environ.setdefault("HF_TOKEN", token) device = _resolve_device() - # bf16 은 RTX 30xx 이상에서 지원. cpu 에선 fp32. - dtype = torch.bfloat16 if device == "cuda" else torch.float32 + # dtype 선택: + # - 이전엔 cuda 면 무조건 bf16 으로 갔는데, torch 2.3.1+cu121 사전빌드 wheel 이 + # sm_86 (RTX 3070 Ti) 의 일부 T5 커널 binary 를 빠뜨려서 inference 첫 호출에 + # "no kernel image is available for execution on the device" 발생. ping/load + # 까지는 통과해서 진단이 까다로웠음 (실제 005930 케이스에서 관측). + # - chronos-t5-small 은 46M params 라 fp32 로도 8GB VRAM 에 여유 충분, 속도 + # 차이도 일봉 30일 예측에선 무시 가능. 호환성 우선해 default 를 fp32 로. + # - 드라이버/torch 업그레이드 후 다시 bf16 시험하려면 .env 에 + # CHRONOS_DTYPE=bf16 (또는 fp16) 두면 됨. + dtype_pref = os.environ.get("CHRONOS_DTYPE", "fp32").lower() + if device == "cuda" and dtype_pref == "bf16": + dtype = torch.bfloat16 + elif device == "cuda" and dtype_pref == "fp16": + dtype = torch.float16 + else: + dtype = torch.float32 logger.info("loading Chronos %s on %s (dtype=%s)", MODEL_NAME, device, dtype) pipe = ChronosPipeline.from_pretrained( MODEL_NAME,