← 목록으로
RTX 5060 8GB로 3분짜리 한국어 노래를 50초 만에 — ACE-Step 1.5 실습
gcube · hands-on

RTX 5060 8GB로 3분짜리 한국어 노래를 50초 만에 — ACE-Step 1.5 실습

on this page
  • gcube RTX 5060 8GB에서 오픈소스 음악 생성 모델 ACE-Step 1.5로 보컬이 들어간 3분 한국어 노래를 50.2초에 생성했습니다.
  • 최대 VRAM은 4.6GB입니다. 8GB 티어 공식 권장 설정(2B turbo + INT8 + CPU 오프로드 + 0.6B LM)을 사용했습니다.
  • Ubuntu 24.04 / Python 3.12 환경에서 막히는 지점 3가지와 해결법, 그대로 실행 가능한 전체 코드를 정리했습니다.
  • 대상 독자: 소비자급 GPU로 음악 생성 AI를 직접 돌려보려는 개발자

들어가며

Suno, Udio 같은 AI 음악 서비스는 이미 익숙하지만, 모델을 직접 돌리려면 고사양 GPU가 필요하다는 인식이 많습니다. 그래서 이번에는 질문을 하나로 좁혔습니다.

“8GB 급 소비자 GPU로 보컬이 들어간 한국어 풀곡을 실용적인 속도로 만들 수 있을까?”

대상은 MIT 라이선스 오픈소스 모델인 ACE-Step 1.5, 환경은 gcube의 RTX 5060 8GB 워크로드입니다. 같은 캐이스 8개를 두 차례 돌려 재현성도 확인했습니다.

벤치마크 결과

케이스모드곡 길이생성 시간최대 VRAM
로파이 연주곡DiT만10초7.7초4.0GB
한국어 발라드 / 시티팝 / 영어 EDMDiT만30초7.0~8.1초4.0~4.2GB
한국어 발라드 / 시티팝 / 영어 EDMDiT + LM 0.6B30초21.3~22.8초4.2~4.4GB
한국어 발라드 풀곡DiT + LM 0.6B180초50.2초4.6GB
  • 측정 환경: RTX 5060 8GB · Ubuntu 24.04 · Python 3.12 · PyTorch 2.10.0+cu128 · ACE-Step 1.5 commit ca1e85f
  • VRAM은 nvidia-smi를 0.3초 간격으로 수집한 최댓값, seed는 42로 고정했습니다.
  • 1차 대비 2차 측정의 생성 시간 차이는 곡당 ±1~3초였습니다 (3분 곡 47.3초 → 50.2초).

눈여겨볼 점은 두 가지입니다. 첫째, LM을 켜면 30초 곡 기준 약 3배 느려지지만 VRAM 증가는 0.2~0.4GB에 그칩니다. 둘째, 곡이 6배 길어져도(30초 → 180초) 생성 시간은 약 2.2배만 늘어, 길이가 길수록 효율이 좋아집니다.

ACE-Step 1.5 구조와 8GB 설정

ACE-Step 1.5는 ACE Studio와 StepFun이 공개한 음악 생성 파운데이션 모델입니다. 50개 이상 언어의 가사를 지원하고, 10초~10분 길이의 곡을 만들며, 커버·구간 재생성(repaint) 같은 편집 기능도 갖췄습니다.

생성은 두 모델이 나눠 맡습니다.

구성크기역할
DiT (acestep-v15-turbo)2B오디오 잠재 표현을 만드는 확산 트랜스포머. 기본 8 step
5Hz LM (acestep-5Hz-lm-0.6B)0.6B곡 설명·가사를 해석해 BPM, 언어, 구조 같은 메타 힌트를 만드는 보조 LM (thinking=True)

ACE-Step은 시작할 때 GPU 메모리를 보고 티어를 정합니다. 공식 GPU 호환성 문서 기준으로 6~12GB 구간의 권장값은 다음과 같고, 이번 실습도 이 설정을 그대로 따랐습니다.

설정값효과
quantizationint8_weight_onlyDiT 가중치를 INT8로 저장해 VRAM 절감
offload_to_cpu / offload_dit_to_cpuTrue쓰지 않는 모듈(VAE, 텍스트 인코더, DiT)을 단계 사이에 CPU로 이동
LM 모델0.6B1.7B 대신 8GB 티어 권장 크기
LM 백엔드ptvLLM 대신 PyTorch 백엔드 (flash-attn 불필요)

4B XL 모델은 오프로드를 켜도 12GB 이상이 필요해 이번 범위에서 제외했습니다.

실습: gcube에서 직접 돌려보기

전체 소요 시간은 1520분입니다. 설치(셀 13)는 한 번만, 모델 로드(셀 4·5)는 노트북을 열 때마다 실행합니다.

Step 1. 워크로드 생성

항목값
GPURTX 5060 8GB
컨테이너 이미지PyTorch 2.10 + CUDA 12.8 내장 Ubuntu 24.04 이미지 (태그 확정 필요)
컨테이너 포트8888
환경변수JUPYTER_TOKEN=접속 비밀번호, PIP_BREAK_SYSTEM_PACKAGES=1
개인 저장소/workspace (모델 약 11GB 보존용, 권장)
# 컨테이너 명령
bash -c "apt-get update -qq && apt-get install -y -qq git ffmpeg libsndfile1 >/dev/null && pip install -q jupyterlab && mkdir -p /workspace && jupyter lab --ip=0.0.0.0 --port=8888 --allow-root --no-browser --ServerApp.root_dir=/workspace"

📷 gcube 워크로드 설정 화면

Step 2. 환경 확인 및 설치

# [셀 1] RTX 50 시리즈(Blackwell)는 sm_120이 목록에 있어야 합니다
!nvidia-smi --query-gpu=name,memory.total --format=csv,noheader
!python3 -c "import torch;print(torch.__version__, torch.cuda.get_arch_list())"
# [셀 2] ACE-Step 설치 (flash-attn 제외, 약 2분 14초)
%cd /workspace
!git clone -q https://github.com/ace-step/ACE-Step-1.5.git
%cd /workspace/ACE-Step-1.5
!grep -v -i flash requirements.txt > req_noflash.txt
!pip install -q -r req_noflash.txt && pip install -q -e . --no-deps
# [셀 3] 8GB용 LM(0.6B) — 기본 다운로드에 포함되지 않음
from huggingface_hub import snapshot_download
snapshot_download("ACE-Step/acestep-5Hz-lm-0.6B",
                  local_dir="/workspace/ACE-Step-1.5/checkpoints/acestep-5Hz-lm-0.6B")

Step 3. 모델 로드

첫 실행 시 메인 모델(약 9.4GB)이 자동으로 다운로드됩니다(2~5분).

# [셀 4] DiT + LM 로드 (8GB 티어 권장 설정)
import os, sys, time, torch
sys.path.insert(0, "/workspace/ACE-Step-1.5")
os.chdir("/workspace/ACE-Step-1.5")
from acestep.handler import AceStepHandler
from acestep.llm_inference import LLMHandler
from acestep.inference import GenerationParams, GenerationConfig, generate_music

dit = AceStepHandler()
print(dit.initialize_service(project_root="/workspace/ACE-Step-1.5", config_path="acestep-v15-turbo",
      device="cuda", offload_to_cpu=True, offload_dit_to_cpu=True, quantization="int8_weight_only"))
llm = LLMHandler()
print(llm.initialize(checkpoint_dir="/workspace/ACE-Step-1.5/checkpoints",
      lm_model_path="acestep-5Hz-lm-0.6B", backend="pt", device="cuda", offload_to_cpu=True))

두 출력이 모두 True로 끝나야 합니다.

# [셀 5] 생성 헬퍼 함수
def make_song(name, caption, duration, lyrics="", lang="unknown", bpm=None,
              instrumental=False, thinking=True, seed=42):
    torch.cuda.reset_peak_memory_stats()
    p = GenerationParams(caption=caption, lyrics=lyrics, instrumental=instrumental, vocal_language=lang,
                         bpm=bpm, duration=duration, thinking=thinking, seed=seed)
    cfg = GenerationConfig(batch_size=1, audio_format="wav", use_random_seed=False)
    start = time.time()
    r = generate_music(dit, llm, p, cfg, save_dir=f"/workspace/out/{name}")
    print(f"{name}: success={r.success} |{time.time()-start:.1f}s | "
          f"peak{torch.cuda.max_memory_allocated()/2**30:.1f}GB (torch)")

Step 4. 생성

# [셀 6] 스모크 테스트: 10초 연주곡, LM 끔
make_song("01_lofi_10s", "chill lo-fi hip hop, mellow piano, soft vinyl crackle, relaxed drums",
          duration=10, bpm=80, instrumental=True, thinking=False)
# [셀 7] 30초 한국어 발라드, LM 켬
ballad = """[Verse]
창문 너머 불빛이 번져
오늘도 너를 떠올려
작은 방 안에 남은 온기
아직 여기 머물러

[Chorus]
괜찮다고 말해줘
내일은 더 밝을 거라고
멀리 있어도 들려줘
우리의 노래를"""

make_song("02_ko_ballad_30s", "emotional Korean ballad, female vocal, piano and strings, warm and nostalgic",
          duration=30, bpm=72, lyrics=ballad, lang="ko")
# [셀 8] 3분 풀곡 — 길이에 맞게 구간 태그를 충분히 넣어야 반복이 줄어듭니다
ballad_full = """[Intro]

[Verse 1]
창문 너머 불빛이 번져
오늘도 너를 떠올려
작은 방 안에 남은 온기
아직 여기 머물러

[Pre-Chorus]
시간은 자꾸 흘러가도
마음은 그 자리에

[Chorus]
괜찮다고 말해줘
내일은 더 밝을 거라고
멀리 있어도 들려줘
우리의 노래를

[Verse 2]
낡은 사진 속 웃음소리
귀가에 다시 맴돌아
함께 걷던 그 골목길
아직 따뜻한 걸

[Chorus]
괜찮다고 말해줘
내일은 더 밝을 거라고
멀리 있어도 들려줘
우리의 노래를

[Bridge]
언젠가 다시 만나면
웃으며 인사할게

[Outro]
우리의 노래를"""

make_song("03_ko_ballad_180s", "emotional Korean ballad, female vocal, piano and strings, warm and nostalgic, full song structure",
          duration=180, bpm=72, lyrics=ballad_full, lang="ko")
# [셀 9] 결과 재생 (48kHz WAV)
import glob
from IPython.display import Audio, display, Markdown
for f in sorted(glob.glob("/workspace/out/*/*.wav"), key=os.path.getmtime):
    display(Markdown(f"**{f.split('/')[-2]}**"))
    display(Audio(f))

🎵 생성 샘플: 30초 발라드 / 3분 풀곡 (오디오 첨부)

가사 작성 팁: 구간은 [Verse], [Chorus] 같은 태그로 나누고 구간 사이에 빈 줄을 둡니다. 한 줄은 6~10음절이 적당합니다. caption은 장르·보컬·악기·분위기를 영어로 쉼표 나열하고, 다른 버전이 필요하면 seed만 바꿉니다.

트러블슈팅

두 차례 실험에서 실제로 부딪힌 문제입니다. 위 코드에는 모두 반영돼 있습니다.

증상원인해결
error: externally-managed-environmentUbuntu 24.04 시스템 Python의 pip 설치 차단 (PEP 668)환경변수 PIP_BREAK_SYSTEM_PACKAGES=1
Failed to build 'flash-attn' (No module named 'torch')Python 3.12에서 소스 빌드 시 빌드 격리 환경이 torch를 찾지 못함requirements에서 제외. pt 백엔드에서는 미사용
git: not found베이스 이미지에 git 미포함컨테이너 명령에서 apt로 설치
5Hz LM model not found ... lm-0.6B기본 다운로드에는 1.7B LM만 포함. 에러 없이 LM만 꺼진 채 생성됨셀 3으로 직접 다운로드
AffineQuantizedTensor ... NotImplementedError 로그 반복INT8 텐서를 파라미터 단위로 옮기는 정상 동작 (INFO 로그)무시
재시작 후 모델·결과 소실/workspace가 컨테이너 내부 디스크개인 저장소 마운트

flash-attn을 제외한 2차 측정과 제외하지 않은 1차(conda Python 3.11 이미지) 측정을 비교했을 때, 생성 시간과 VRAM에 의미 있는 차이는 없었습니다.

자주 묻는 질문

Q. 8GB GPU로 AI 음악 생성이 가능한가요? 가능합니다. ACE-Step 1.5 2B turbo 모델에 INT8 양자화와 CPU 오프로드를 적용하면, RTX 5060 8GB에서 3분 보컬 곡을 최대 VRAM 4.6GB로 생성할 수 있습니다.

Q. 3분 노래 한 곡을 만드는 데 얼마나 걸리나요? RTX 5060 8GB에서 LM을 켜고 약 50초 걸렸습니다. LM을 끄면 30초 곡 기준 약 3배 빨라집니다.

Q. 한국어 가사도 되나요? 됩니다. ACE-Step 1.5는 50개 이상 언어를 지원하며, vocal_language="ko"로 지정하면 됩니다.

Q. 상업적으로 써도 되나요? ACE-Step 1.5 코드와 모델은 MIT 라이선스입니다. 다만 기존 곡의 가사나 음원을 입력하면 원저작권 문제가 생길 수 있으므로, 직접 쓴 가사를 사용하세요.

Q. flash-attn이 꼭 필요한가요? 8GB 설정(PyTorch 백엔드)에서는 필요하지 않습니다. vLLM 백엔드나 LoRA 학습을 쓸 때 영향을 줍니다.

마치며

RTX 5060 8GB는 음악 생성 AI를 실용적으로 돌리기에 충분했습니다. 3분 풀곡을 1분 안에 만들고도 VRAM이 절반 가까이 남아, 가사와 장르를 바꿔 가며 여러 버전을 빠르게 비교할 수 있습니다. 음질과 한국어 발음은 수치로 평가하지 않았으니 직접 들어보고 판단해 보세요.

gcube에서 바로 시작하기 로컬에 GPU가 없어도 gcube에서 RTX 5060 워크로드를 만들면 이 글의 코드를 그대로 실행할 수 있습니다.

참고 자료