이 글은 영문 원문을 번역한 것입니다. 내용이 다르면 영문 원문이 기준입니다.
ArtifactNet 연구 · Part 5 · 2/3 · 2026년 5월
증류와 런타임 — 가벼움 ≠ 빠름
ArtifactNet 연구 여정의 Part 5입니다. 2026년 5월에 SOTA 탐지 정확도를 4초 배치 추론에서 스트리밍 방식의 실시간 처리로 옮기려 했던 기록입니다. 모델을 줄였더니 오히려 느려졌고, 런타임을 28가지로 바꿔 보다가 하드웨어 하한선에 부딪혔으며, "실시간 모델"과 "탐지 모델"은 같은 것이 아니라는 값비싼 교훈을 얻었습니다. 정확도 중심 모델을 실시간 제약 안으로 밀어 넣는 엔지니어링을, 성공과 실패를 가리지 않고 담담하게 적었습니다.
현재 모델이 실제로 동작하는 모습을 보고 싶으신가요? 무료 데모로 아무 트랙이나 돌려 보세요 — 아래에서 설명하는 것과 같은 포렌식 파이프라인이며, 계정이 필요 없습니다.
ArtifactNet의 탐지 파이프라인은 본질적으로 오프라인 방식입니다.
audio → STFT → ArtifactUNet (residual extraction) → HPSS → 7-channel forensic features
→ ResidualCNN → per-segment P(AI) → per-track median verdict
한 트랙을 판정하기 위해 4초짜리 청크 일곱 개를 추출해 하나의 배치로 실행합니다. 트랙당 0.58s이면 충분하고, 사용자는 결과만 원하므로 지연 시간은 한 번도 문제가 된 적이 없습니다.
문제는 반대 방향의 쌍둥이 연구에서 시작됐습니다. 같은 잔차 물리를 이용해 AI 오디오의 RVQ 고스팅을 제거하면 품질 복원 도구(de-artifact)가 됩니다. 그리고 우리는 그것을 오디오 플러그인(VST3)으로 만들고 싶었습니다. 플러그인은 호스트가 넘겨주는 256/512샘플 블록을 그 자리에서 즉시 처리해 돌려줘야 합니다. 미래 프레임을 볼 수 없고(인과적), 4초를 기다릴 수도 없습니다.
즉, 같은 ArtifactUNet 백본이 두 세계에서 모두 동작해야 했습니다:
| 탐지 | de-artifact 실시간 | |
|---|---|---|
| 처리 단위 | 4s 청크 배치 | 수십 ms 블록 스트리밍 |
| 미래 프레임 | 허용(양방향) | 금지(인과적) |
| 지연 | 무관 | 수백 ms 이내 |
| 출력 | P(AI) | 복원된 파형 |
5월의 작업은 그 간극을 잇는 엔지니어링이었습니다. 그리고 그 과정에서 "작은 모델이 더 빠르다"는 직관이 세 번 깨졌습니다.
첫 설계는 ArtifactUNetLite였습니다. 파라미터 1.85M(3.6M Teacher의 절반), 44.1/48/96 kHz를 모델 하나로 처리하는 멀티레이트 아키텍처, 그리고 플러그인용 인과적 스트리밍을 갖췄습니다.
몇 가지 설계 결정은 명확하게 확정했습니다:
CausalChannelLayerNorm(프레임별 LN)만 사용합니다. GroupNorm/BatchNorm은 시간 축에 걸쳐 통계를 새어 나가게 해서 인과성을 깨뜨립니다. 단위 테스트로 "미래가 과거 출력에 미치는 영향 = 0"을 강제했습니다(과거 Δ = 0.00).residual = m·X, clean = (1−m)·X로 상보적인 한 쌍이 되도록 강제됩니다.단위 테스트 8개가 모두 통과했습니다. 멀티레이트 홉은 44.1/48/96 전반에서 2.90ms로 일관됐고, 잔차+clean은 8.94e-08의 오차로 입력을 복원했으며, 인과성도 유지됐습니다.
그런데 속도를 측정해 보니 충격적이었습니다. Lite는 파라미터를 절반으로 줄였는데도 CPU에서 기존 탐지 UNet보다 2.5× 느렸습니다.
파고들어 보니 원인은 분명했습니다:
첫 번째 교훈: 파라미터 수는 속도의 대리 지표가 아닙니다. 실시간 속도는 (a) 큰 홉으로 프레임 수를 줄이고, (b) 디코더로 갈수록 채널을 좁혀 누적 비용을 낮추는 데서 나오는데, Lite는 두 가지를 모두 포기했습니다.
Lite를 버린 것은 아닙니다. 모델 하나로 멀티레이트를 처리하는 점, 룩어헤드가 없는 인과적 스트리밍, 작은 가중치 메모리(모바일·저장 공간에 유리)는 여전히 진짜 가치로 남았습니다. 다만 "RT 가속" 경로로는 다시는 제안하지 않기로 못 박았습니다.
다음은 진정한 실시간 제거를 위한 ArtifactUNetRT 시리즈였습니다. 4초 청크 대신 짧은 프레임을 스트리밍합니다:
| 이름 | T 프레임 | 청크 길이 | 용도 |
|---|---|---|---|
| RT8 | 8 | ~93ms | 최저 지연 시간 |
| RT16 | 16 | ~186ms | 권장 저지연 |
| RT24 | 24 | ~278ms | |
| RT48 | 48 | ~557ms | 표준 모드 |
핵심 기법은 두 가지입니다:
CausalCLN을 추론 시에는 표준 LayerNorm 패턴으로 교체합니다(수치적으로 동일하며, 자세한 내용은 §6에서 다룹니다).RT 시리즈는 N_FFT=1024(파라미터 117K)를 사용합니다. 지연 시간을 낮추는 데 맞춘 작은 스펙트럼 입력입니다. VST3 실시간 제거에는 훌륭했습니다.
하지만 여기서 함정에 빠졌습니다. "이 빠른 RT 모델을 탐지 파이프라인에도 그대로 쓰면 되지 않을까?" 그래서 그 모델의 잔차를 추출해 기존 탐지 CNN에 통과시켰더니, CNN 호환성이 30%로 무너졌습니다.
원인은 단순하면서도 근본적이었습니다. 탐지 CNN은 N_FFT=2048 스펙트럼 기저에서 학습됐습니다. RT 모델은 N_FFT=1024를 쓰는데, 입력 공간이 완전히 다릅니다. 잔차의 주파수 해상도가 절반이므로 CNN은 한 번도 본 적 없는 분포를 마주하게 됩니다. 입력 공간이 다른 두 모델은 직접 비교조차 할 수 없었습니다.
두 번째 교훈: 실시간을 위해 바꾼 스펙트럼 기저는 다운스트림 모델과 호환되지 않습니다. 속도를 위해 N_FFT를 줄인 것은 제거에서만 통하는 선택이었고, 탐지로 넘어갈 수는 없었습니다.
세 번째 모델이 두 세계를 잇는 다리가 됐습니다. ArtifactUNetFast는 Teacher(3.6M)보다 6.7× 작은 534K 모델이면서 N_FFT=2048을 유지합니다. 같은 스펙트럼 기저를 쓰므로 탐지 파이프라인에 곧바로 들어가고, 인과적 스트리밍도 지원합니다.
| 항목 | 사양 |
|---|---|
| 파라미터 | 534K(Teacher보다 6.7× 작음) |
| 아키텍처 | CausalDSConv + CausalCLN, 4단계 U-Net, base_channels=24 |
| 입력 | (B, 2, 1025, T) — cat([H_mag, P_mag]), 단일 순전파(Teacher는 두 번) |
| 출력 | (B, 2, 1025, T) — [mask_H, mask_P] ∈ [0, 0.5]² |
| 학습 | 고정된 Teacher로부터의 지식 증류 |
| 손실 | 1.0 × MSE(mask) + 0.1 × spectral_convergence |
| 데이터 | AIME + Jamendo + lo-fi hiphop(파일 12K개, 청크 60K개, SR 풀 44.1/48k) |
증류의 핵심은 Teacher의 마스크를 모방하는 것이며, 동시에 입력을 2채널로 묶어 H/P를 한 번의 순전파로 처리합니다(Teacher는 H와 P를 두 번 실행합니다). 최저 손실 0.06645로 수렴한 뒤 10개 트랙에서 Teacher와 비교했습니다:
| 지표 | 값 |
|---|---|
| 마스크 Pearson | H=0.84, P=0.86(강한 상관) |
| 마스크 MAE | H=0.080, P=0.073 |
| 마스크 분포 | Student 0.28 대 Teacher 0.31 |
| 스펙트럼 수렴도 | 0.38(잔차의 성격이 보존됨) |
마스크는 Teacher의 것보다 다소 거칠지만 분포와 성격은 보존되어 있어, 잔차 추출은 올바르게 동작합니다.
속도가 핵심 성과였습니다. PyTorch에서는 Teacher와 비슷하지만, ONNX Runtime으로 옮기면 모든 것이 달라집니다:
| 모델 | ORT CPU 4스레드 p50 | RTF | 총 지연 |
|---|---|---|---|
| Teacher(PyTorch, 순전파 2회) | ~998ms | 0.25 | ~4s |
| Fast(PyTorch, 순전파 1회) | ~1066ms | 0.27 | ~4s |
| Fast ORT T=16 | 18.5ms | 0.10 | 204ms ✅ |
| Fast ORT T=24 | 27.8ms | 0.10 | 306ms |
ORT에서는 PyTorch 대비 50× 빨라졌습니다. T16에서 청크(186ms)와 추론(18.5ms)을 더하면 총 지연 시간이 204ms로, 실시간 플러그인의 지연 예산 안에 들어옵니다.
산출물은 세 가지 형태로 내보냈습니다. 원본 ONNX(ORT 런타임용), CausalCLN 수술 버전(Rust/tract 전용 커스텀 연산), onnxsim으로 최적화한 버전입니다. 수술 버전은 ORT에서 세션 생성에 실패하므로(커스텀 연산 미지원) Rust/tract 전용이라는 점에 유의하세요. 이 갈림길이 다음 섹션의 런타임 전쟁으로 이어집니다.
모델이 정해지자 질문은 어떤 런타임에서 돌릴 것인가로 바뀌었습니다. de-artifact 실시간 제거(RT48 스테레오)의 지연 시간을 조금이라도 줄이려고, 거의 모든 추론 엔진과 설정을 끝까지 시도했습니다.
| 단계 | RTF(스테레오) |
|---|---|
| tract 순차 실행(시작점) | 0.416 |
| tract 병렬 L‖R | 0.218 |
| ORT FP32 4‖4 전환 | 0.031 |
| ORT 설정 튜닝 | 0.029 |
| CausalCLN→LayerNorm ONNX 수술 | 0.023 |
| 이론상 최소(커스텀 연산 필요) | ~0.018 |
tract에서 ONNX Runtime으로 옮기기만 해도 RTF가 0.416에서 0.031로 개선되어 18× 향상됐습니다(tract의 순차 실행 대 ORT의 MLAS 최적화와 L/R 세션 병렬화). 수술을 거치자 0.023까지 내려갔습니다. 절대적인 CPU 하한선(Ryzen 5800X, AVX2 FP32)은 스테레오 11.9ms, RTF 0.022였습니다.
| 설정 | 지연(p50) | RTF | CPU 대비 |
|---|---|---|---|
| CPU 스테레오 4‖4T | 12.2ms | 0.0223 | 1× |
| CUDA 순차 L→R | 3.9ms | 0.0072 | 3.1× |
| CUDA Graph FP16 | 2.52ms | 0.0046 | 4.8× |
| TRT FP16 순차 | 1.71ms | 0.0031 | 7.1× |
| TRT FP16 batch=2 | 1.44ms | 0.0026 | 8.5× |
GPU(RTX 3060)의 최종 하한선은 TensorRT FP16 batch=2, 1.44ms(RTF 0.0026)였습니다. 스테레오 L+R을 한 번의 순전파의 배치 차원에 묶는 방식이 멀티 스트림보다 항상 빨랐습니다(TRT의 배치 융합이 SM 자원을 최적으로 배분하기 때문입니다). LayerNorm을 FP16으로 강제해(FP32 폴백 비활성화) 5%를 더 얻었습니다.
빨라 보였지만 실패했거나 오히려 성능이 떨어진 경로들:
ORT SessionBuilder 옵션 28개를 모두 소진한 뒤, 우리는 11.5–12.3ms가 이 하드웨어의 절대 최소치라고 결론 내렸습니다. 이보다 더 줄이려면 모델 재학습(축소)이나 새 하드웨어가 필요합니다. 이것은 패배가 아니라 경계를 확정한 것입니다. 가능한 범위를 알면 그 위에서 무엇을 포기할지 판단할 수 있습니다.
런타임 단계 전반에 걸쳐 거듭 등장한 CausalCLN→LayerNorm 수술에 대해 짚어 둡니다. 가장 작으면서도 가장 깔끔한 최적화였습니다.
학습 시점의 CausalChannelLayerNorm은 프레임마다 (C,F) 통계를 계산하는 커스텀 연산입니다. 인과성은 보장하지만 추론 그래프에서는 표준 ONNX 연산으로 깔끔하게 대응되지 않습니다. 그래서 그래프를 직접 수술해 수치적으로 동등한 표준 LayerNorm + transpose 패턴으로 바꿨습니다.
핵심은 출력은 비트 단위로 동일한 채 런타임만 빨라진다는 점입니다. ORT가 표준 LayerNorm 패턴을 융합 커널로 인식하기 때문입니다. ORT 1.24.x에서 다시 검증한 결과, 수술로 실측 +3.69ms의 이득을 얻었습니다. 프로파일에서는 LayerNorm이 전체의 20.1%, 수술로 생긴 Transpose가 16.8%를 차지했지만, 그래도 순이득이었습니다.
흥미로운 반례가 하나 있습니다. 같은 LayerNorm을 Rust 커스텀 연산으로 직접 구현했더니 오히려 모노가 1.3ms 느려졌습니다. T=48의 작은 루프에서는 ORT의 MLAS 융합 구현이 루프로 전치하는 Rust 구현보다 빨랐습니다. "손으로 짠 커널이 항상 더 빠르다"는 것도 틀린 직관이었습니다.
실시간 제거가 RT/Fast로 갈라지는 동안, 탐지 파이프라인 자체도 ORT로 옮길 수 있는지 확인했습니다. 답은 Teacher를 ONNX로 직접 내보내는 것이었습니다.
| 항목 | 결과 |
|---|---|
| ORT 4스레드 모노 | 275.8ms(<500ms 목표 달성) |
| CNN 판정 일치율 | 100% (9/9) |
| 수치 오차 | 최대 2.56e-06 |
| 파라미터 | 3.6M |
| ONNX 노드 | 76(단순한 UNet 구조) |
N_FFT=2048을 유지한 덕분에 탐지 CNN과 판정이 100% 일치했습니다(수치 오차 2.56e-06). 이것이 RT 모델과의 결정적인 차이입니다:
| 모델 | ORT 속도 | CNN 호환성 | 용도 |
|---|---|---|---|
| RT(N_FFT=1024, 117K) | 스테레오 12.3ms | 30% | VST3 전용 |
| Teacher(N_FFT=2048, 3.6M) | 모노 275.8ms | 100% | 탐지 파이프라인 |
탐지의 해답은 작은 RT 모델이 아니라 큰 Teacher입니다. 기준은 속도가 아니라 호환성이었습니다.
이 글의 핵심입니다. 5월 내내 빠른 모델을 탐지 파이프라인에 그대로 쓰고 싶은 유혹이 끈질기게 이어졌습니다. 세 번 실패했고, 매번 이유가 달랐습니다.
(1) ArtifactUNetRT — 스펙트럼 기저 불일치. N_FFT=1024라서 CNN 호환성이 30%였습니다. (§3)
(2) ArtifactUNetLite — 파라미터 역전. 1.85M인데도 CPU에서 탐지 UNet보다 2.5× 느렸습니다. (§2)
(3) ArtifactUNetFast — 두 겹의 함정.
Fast는 N_FFT=2048을 유지하므로 RT의 호환성 문제가 전혀 없습니다. 그러면 자연스럽게 이런 질문이 떠오릅니다. "Fast를 기반으로 탐지 CNN을 재학습하면 어떨까?" 잔차를 비교해 보니 두 가지가 드러났습니다:
| UNet 경로 | TPR(AI) | FPR(실제) |
|---|---|---|
| codec4(현재 프로덕션) | 98.0% | 0.0% |
| phase2(Fast의 Teacher) | 100.0% | 55.0% |
| Fast(드롭인) | 98.0% | 52.5% |
올바른 순서는 분명했습니다. Fast로 탐지하려면 먼저 코덱을 인식하는 Teacher(codec4)로 재증류한 다음 그 위에 CNN을 쌓아야 합니다. 또한 실시간 스트리밍이 목표가 아니라면 탐지에는 인과 제약이 필요 없으므로, 양방향 경량 Student가 정확도와 효율 양쪽에서 이깁니다.
세 번째이자 가장 큰 교훈: 실시간 제약(인과성, 짧은 홉, 작은 N_FFT, 2채널 융합)은 탐지 정확도 및 속도와 정면으로 충돌합니다. 백본 하나로 두 세계를 감당하려는 야심은 매번 다른 대가를 치르게 했습니다. 결론은 역할을 나누는 것이었습니다. 제거에는 Fast/RT, 탐지에는 Teacher/codec4를 씁니다.
두 가지 점검으로 한 달을 마무리했습니다.
적대적 회피 테스트. de-artifact의 목적은 오디오 품질 개선이지 탐지 회피가 아닙니다. 그래도 사전 점검 차원에서, 우리의 억제 도구가 회피에 악용될 수 있는지 스스로 확인했습니다. 원본과 억제 강도 α=0.5/1/2/4에서의 출력을 탐지 파이프라인에 통과시켜 P(AI)의 변화를 측정했습니다. (탐지 견고성은 이후 Part에서 다룹니다.)
경량 SOTA 비교. 같은 시기에 작은 부분 집합(SONICS 가짜 150 + 실제 150)에서 외부 기준선(MERT 기반 2단계 모델, 174M 파라미터)과 맞붙어 봤습니다. 4.2M 파라미터의 ArtifactNet이 TPR 100%, FPR 10.7%, F1 0.949로 앞섰고, 174M 모델(F1 0.929)을 이겼으며, 트랙당 0.58s 대 2.62s로 4.5× 더 빨랐습니다. 부분 집합의 규모를 감안하면 중요한 것은 절대 수치가 아니라 40× 파라미터 격차에도 앞선 우위입니다. 작은 모델이 실시간으로 가는 출발점이라는 이 시리즈의 전제를 다시 확인한 셈입니다.
파라미터 수는 속도가 아닙니다. 두 번의 역전, 즉 Lite(2.5×)와 Fast(3.44×)는 같은 사실을 가리켰습니다. 실시간 속도는 홉 크기, 채널 테이퍼링, 활성화 텐서 크기, 커널 실행 횟수에서 나옵니다. 모델을 줄이기 전에 실제로 무엇이 느린지 프로파일링하세요.
실시간 최적화는 다운스트림 호환성을 깨뜨립니다. N_FFT 축소(RT)와 인과성/2채널 융합(Fast)은 모두 다운스트림 탐지 CNN과 충돌했습니다. 하나의 백본을 여러 용도로 재사용하려면 먼저 어떤 축은 공유하고 어떤 축은 갈라놓을지 정해야 합니다. 우리는 스펙트럼 기저(N_FFT=2048)는 공유하고, 인과성과 채널 융합은 갈라놓았습니다.
런타임을 끝까지 시도하는 것은 패배가 아니라 경계 설정입니다. tract→ORT→TVM→OpenVINO→TensorRT를 차례로 돌려 하드웨어 하한선(CPU 11.9ms, GPU 1.44ms)을 확정한 덕분에, 그 하한선 위에서 무엇을 포기하고 무엇을 재학습할지 합리적으로 정할 수 있었습니다.
다음 Part에서는 이렇게 다듬은 SOTA를 들고 나가 남은 약점을 공략합니다. 그러다 오히려 우리 자신의 평가 방법론을 의심하게 됩니다.
ArtifactNet 연구팀 · 2026년 5월