Force streamer.end() in finally — transformers 5.x doesn't always auto-call it
Browse files
src/kpaa/llm/zerogpu_backend.py
CHANGED
|
@@ -159,9 +159,17 @@ class ZeroGPUBackend:
|
|
| 159 |
print(f"[kpaa.zerogpu] generate() returned normally", flush=True)
|
| 160 |
except Exception as e:
|
| 161 |
print(f"[kpaa.zerogpu] generate() raised: {type(e).__name__}: {e}", flush=True)
|
| 162 |
-
# streamer 의 종료 신호 — 이게 없으면 next(streamer) 가 영원히 블록.
|
| 163 |
-
streamer.end()
|
| 164 |
raise
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 165 |
|
| 166 |
gen_thread = Thread(target=_generate_target, daemon=True)
|
| 167 |
gen_thread.start()
|
|
|
|
| 159 |
print(f"[kpaa.zerogpu] generate() returned normally", flush=True)
|
| 160 |
except Exception as e:
|
| 161 |
print(f"[kpaa.zerogpu] generate() raised: {type(e).__name__}: {e}", flush=True)
|
|
|
|
|
|
|
| 162 |
raise
|
| 163 |
+
finally:
|
| 164 |
+
# transformers 5.x 에서 streamer.end() 가 generate 종료 시점에
|
| 165 |
+
# 자동 호출되지 않는 케이스가 있음 → next(streamer) 가 영원히
|
| 166 |
+
# 블록. 성공/실패 모두 명시적으로 end() 호출해 stop_signal
|
| 167 |
+
# 을 큐에 넣어 consumer 의 StopIteration 을 보장.
|
| 168 |
+
try:
|
| 169 |
+
streamer.end()
|
| 170 |
+
print(f"[kpaa.zerogpu] streamer.end() called", flush=True)
|
| 171 |
+
except Exception as e:
|
| 172 |
+
print(f"[kpaa.zerogpu] streamer.end() failed: {e}", flush=True)
|
| 173 |
|
| 174 |
gen_thread = Thread(target=_generate_target, daemon=True)
|
| 175 |
gen_thread.start()
|