Some checks failed
Windows / verify (push) Has been cancelled
러너를 여러 프로젝트가 공유한다는 전제에서 두 가지 구멍이 있었다.
1) 동시 실행 — GPU 는 나눠 쓸 수 없다. 두 작업이 같이 VRAM 을 잡으면
둘 다 OOM 이거나, 더 나쁘게는 하나가 조용히 느려져 원인을 못 찾는다.
concurrency(같은 저장소) + 러너 capacity:1(저장소 무관, 진짜 보장)을
두 겹으로 두고, 문서에 capacity 확인을 필수 절차로 넣었다.
한 대에 러너 프로세스를 여러 개 띄우면 안 된다는 것도 명시.
2) 티어 검증이 주장보다 얕았다 — "4·5티어 검증"이라 해놓고 실제로는
tier_availability() 만 봤고, 그 함수는 torch 유무만 본다. 즉
- 4티어(Seed-X AWQ Int4)는 autoawq 가 없어도 "사용 가능"
- 5티어(Qwen3-8B)는 VRAM 11GB 가 필요한데 8GB 카드에서도 "사용 가능"
게이트가 통과인데 실제로는 못 올리는 상태를 CI 가 못 잡고 있었다.
그래서 게이트 검사는 얕은 검사임을 이름과 주석에 명시하고, 그 옆에
**진짜로 모델을 올려 번역까지 하는** 항목을 새로 뒀다. 러너 GPU 가
무엇일지 모르므로 여유 VRAM 과 autoawq 유무로 후보를 거른 뒤 올릴 수
있는 것 중 가장 무거운 티어를 고르고, 건너뛴 티어와 그 이유를 결과에
남긴다. 하나도 못 올리면 실패다 (조용히 통과하지 않는다).
게이트는 통과인데 실제 로드가 실패하면 그게 찾아야 할 버그다 — 앱이
사용자에게 "쓸 수 있다"고 하고선 못 올리는 상황. 러너가 붙으면 실제
증거를 보고 tier_availability() 를 고칠지 판단한다.
- autoawq 설치 단계 추가(4티어 전용, Windows 휠이 없을 때가 있어 선택)
- 1~3티어 CUDA 경로 번역 검사는 유지하고 unload 를 finally 로 보장
검증: pytest 189개 통과, ruff clean, 워크플로 파싱·concurrency 확인,
--gpu 를 torch 없는 환경에서 실행해 6개 중 5개가 의도대로 실패
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
89 lines
3.7 KiB
YAML
89 lines
3.7 KiB
YAML
# Windows GPU 검증 — GPU 가 달린 러너에서만
|
|
#
|
|
# GPU 는 한 VM 만 독점한다(컨슈머 NVIDIA 는 vGPU 미지원). 그래서 GPU 없는
|
|
# 상시 CI VM(runs-on: windows)에서는 CUDA·VRAM·4~5티어를 확인할 수 없다.
|
|
# 그 항목만 떼어내 별도 라벨로 돌린다.
|
|
#
|
|
# 러너 라벨: windows-gpu:host
|
|
# - GPU 가 달린 Windows 머신에 등록한다 (두 번째 GPU를 꽂은 VM, 또는 실물 PC)
|
|
# - 상시로 띄울 필요 없다. 필요할 때만 daemon 을 켜면 된다
|
|
#
|
|
# 그래서 트리거도 **수동 실행만** 이다. 러너가 없으면 큐에 쌓이기만 하고
|
|
# 아무 일도 일어나지 않는다. 자동으로 돌리고 싶으면 push 트리거를 켜면 된다.
|
|
|
|
name: Windows GPU
|
|
|
|
on:
|
|
workflow_dispatch:
|
|
|
|
# GPU 는 나눠 쓸 수 없다. 두 작업이 동시에 VRAM 을 잡으면 둘 다 OOM 으로
|
|
# 죽거나, 더 나쁘게는 하나가 조용히 느려져 원인을 못 찾는다.
|
|
# 이건 같은 저장소 안에서만 막아준다. **다른 저장소까지 포함한 진짜 보장은
|
|
# 러너의 capacity: 1** 이다 (docs/WINDOWS-TESTING.md 참고).
|
|
concurrency:
|
|
group: windows-gpu
|
|
cancel-in-progress: false
|
|
|
|
jobs:
|
|
gpu:
|
|
runs-on: windows-gpu
|
|
timeout-minutes: 90
|
|
|
|
steps:
|
|
# 라벨이 안 맞으면 Gitea 가 기본 ubuntu 컨테이너로 떨어뜨린다.
|
|
# GPU 를 확인하겠다고 부른 작업이 엉뚱한 데서 도는 일은 막아야 한다.
|
|
- name: Windows 인지 확인
|
|
shell: pwsh
|
|
run: |
|
|
Write-Host "RUNNER_OS=$env:RUNNER_OS"
|
|
if ($env:RUNNER_OS -ne "Windows") {
|
|
Write-Host "::error::Windows 러너가 아닙니다 ($env:RUNNER_OS)."
|
|
Write-Host "::error::러너를 'windows-gpu:host' 라벨로 등록했는지 확인하세요."
|
|
exit 1
|
|
}
|
|
|
|
- name: NVIDIA GPU 가 실제로 보이는지
|
|
shell: pwsh
|
|
run: |
|
|
nvidia-smi --query-gpu=name,memory.total --format=csv,noheader
|
|
if ($LASTEXITCODE -ne 0) {
|
|
Write-Host "::error::nvidia-smi 실패 — 이 러너에는 GPU 가 없습니다."
|
|
exit 1
|
|
}
|
|
|
|
- name: 소스 받기
|
|
uses: actions/checkout@v4
|
|
|
|
# 포터블 CI 와 달리 여기서는 torch CUDA 빌드가 필요하다.
|
|
# 4~5티어(Seed-X / Qwen3)가 torch 위에서 돌기 때문이다.
|
|
- name: 의존성 설치 (torch CUDA 포함)
|
|
shell: pwsh
|
|
run: |
|
|
python -m venv .venv-gpu
|
|
.\.venv-gpu\Scripts\python -m pip install --upgrade pip --quiet
|
|
.\.venv-gpu\Scripts\python -m pip install torch --index-url https://download.pytorch.org/whl/cu128
|
|
.\.venv-gpu\Scripts\python -m pip install -r requirements.txt
|
|
.\.venv-gpu\Scripts\python -c "import torch; assert torch.cuda.is_available(), 'CUDA 안 잡힘 — CPU 빌드가 깔렸는지 확인'; print('CUDA OK:', torch.cuda.get_device_name(0))"
|
|
|
|
# 4티어(Seed-X AWQ Int4)에만 필요하고 Windows 휠이 없을 때가 있다.
|
|
# 실패해도 멈추지 않는다 — 점검기가 autoawq 유무를 보고 4티어를
|
|
# 건너뛰면서 "건너뜀: 정밀(autoawq 없음)" 이라고 분명히 남긴다.
|
|
- name: autoawq (4티어 전용, 선택)
|
|
shell: pwsh
|
|
continue-on-error: true
|
|
run: .\.venv-gpu\Scripts\python -m pip install autoawq
|
|
|
|
- name: GPU 전용 점검
|
|
shell: pwsh
|
|
env:
|
|
PYTHONPATH: src
|
|
run: .\.venv-gpu\Scripts\python packaging\windows_smoke.py --gpu
|
|
|
|
- name: 결과물 업로드
|
|
uses: actions/upload-artifact@v4
|
|
if: always()
|
|
with:
|
|
name: LiveSub-gpu-report
|
|
path: artifacts/*.txt
|
|
retention-days: 14
|