From ea885973c7b8a3158b4a4fed7459cbf330b12635 Mon Sep 17 00:00:00 2001 From: claude-owner Date: Sat, 23 May 2026 16:03:31 +0900 Subject: [PATCH] =?UTF-8?q?fix(chronos):=20cuda=20=EB=8F=84=20fp32=20?= =?UTF-8?q?=EA=B8=B0=EB=B3=B8=20=E2=80=94=20sm=5F86=20bf16=20=EC=BB=A4?= =?UTF-8?q?=EB=84=90=20=EB=88=84=EB=9D=BD=20=EC=9A=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit torch 2.3.1+cu121 사전빌드 wheel 이 RTX 3070 Ti(sm_86) 의 일부 T5 bf16 커널을 빠뜨려서 inference 첫 호출에 'no kernel image is available for execution on the device' 가 났음. ping/_load 까지는 통과해 진단이 까다로움. chronos-t5-small 은 46M params 라 fp32 로도 8GB VRAM 여유 충분. cuda 도 fp32 default 로 바꾸고, CHRONOS_DTYPE=bf16|fp16 env 로 강제 가능하게 둠. 005930 h=1 예측 409 의 실제 원인이 이거였음 (LAN 으로 직접 확인). --- backend/app/models/chronos.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) 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,