AI 는 파이썬으로 짜는데 인프라는 왜 Rust 로 가나
요즘 AI 쪽에서 파이썬 코드 밑을 Rust 로 바꾸는 경우가 부쩍 많아졌어요. 모델은 여전히 파이썬으로 짜는데 왜 그 속만 갈아 끼우는지, 나는 언제 Rust 를 꺼내면 되는지 정리했어요.
AI 모델은 거의 다 파이썬으로 만들어요. PyTorch 도, 노트북도, 논문 코드도 파이썬이에요. 그런데 요즘 AI 쪽 오픈소스를 열어 보면 이상한 게 보여요. 토크나이저, 모델 파일 포맷, 데이터프레임, 추론 서버, 벡터 DB 의 속이 Rust 로 바뀌고 있어요.
파이썬이 이렇게 잘나가는데 왜 그 밑은 다른 언어로 옮겨 갈까요. 답은 "파이썬이 실제로 하는 일"을 한 겹 벗겨 보면 나와요.
파이썬 코드 밑에서 실제로 일하는 것
model(x) 한 줄을 실행하면 파이썬이 행렬 곱셈을 하는 게 아니에요. 파이썬은 "이 계산을 해라"라고 지시만 하고, 실제 계산은 아래층이 해요.
파이썬 — 무엇을 할지 정한다
↓
C++ — PyTorch 본체, 연산을 쪼갠다
↓
CUDA — GPU 에서 돌 커널
↓
GPU — 실제로 곱하고 더한다그래서 파이썬이 느려도 모델 학습은 빨라요. 무거운 일은 전부 C++ 과 GPU 가 하니까요. 파이썬은 지휘자예요. 악기는 안 불어요.
문제는 GPU 가 아니라 그 앞에 있다
GPU 는 비싸요. 그런데 비싼 GPU 가 생각보다 자주 놀아요. 다음 데이터를 기다리느라요.
모델에 들어가기 전에 해야 할 일이 많아요. 파일을 읽고, 텍스트를 토큰으로 자르고, 이미지를 줄이고, 배치로 묶어요. 이건 전부 CPU 일이에요. 이 단계가 파이썬으로 짜여 있으면 여기서 막혀요. GPU 는 1초에 수천 개를 처리할 수 있는데, 앞에서 수백 개씩밖에 못 넘겨주는 거예요.
파이썬이 이런 일에 약한 이유는 두 가지예요.
- 느린 반복문. 파이썬은 한 줄 한 줄 해석하며 실행해서, 수백만 번 도는 단순 반복이 컴파일 언어보다 수십 배 느려요.
- GIL. 파이썬 인터프리터는 한 번에 한 스레드만 파이썬 코드를 돌리게 막는 잠금(GIL)이 있어요. CPU 코어가 16개여도 순수 파이썬 코드는 사실상 한 코어로 돌아요. 3.13 에서 GIL 없는 빌드가 실험으로 나왔고 3.14 에서 정식 지원이 됐지만, 아직 기본값은 아니에요.
그래서 "GPU 앞의 CPU 일"을 빠른 언어로 내려보내야 해요. 예전엔 그 자리가 당연히 C++ 이었어요. 요즘은 Rust 가 그 자리를 많이 가져가고 있어요.
왜 하필 Rust 인가
C++ 도 빠른데 굳이 Rust 를 고르는 이유는 이래요.
1. 쓰레기 수거기 없이 빠르다. Rust 는 C++ 처럼 기계어로 컴파일되고, 자바나 Go 처럼 실행 중에 메모리를 정리하느라 멈추는 시간(GC)이 없어요. 응답 시간이 들쭉날쭉하면 안 되는 추론 서버에서 이게 중요해요.
2. 메모리 사고를 컴파일러가 막는다. C++ 로 짠 코드의 큰 골칫거리는 이미 해제한 메모리를 쓰거나, 배열 끝을 넘어 쓰는 실수예요. 이런 버그는 가끔만 터지고, 터지면 보안 구멍이 돼요. Rust 는 소유권 규칙으로 이런 코드를 아예 컴파일이 안 되게 막아요. 빠른 것과 안전한 것을 같이 가져가는 거예요.
3. 병렬이 안전하다. 여러 스레드가 같은 데이터를 동시에 고치다 꼬이는 버그(데이터 경쟁)도 Rust 컴파일러가 잡아요. GIL 같은 잠금 없이 코어를 전부 쓸 수 있어서, 앞에서 말한 "GPU 앞의 CPU 일"에 딱 맞아요.
4. 메모리 모양을 직접 정할 수 있다. 데이터를 메모리에 어떤 순서로 놓을지 손으로 정할 수 있어요. 그래서 파일을 복사하지 않고 그대로 메모리에 비춰서 읽거나(제로카피), 다른 프로그램과 같은 메모리 모양(Apache Arrow)을 공유할 수 있어요.
5. 파이썬에 붙이기 쉽다. 이게 결정적이에요. PyO3 라는 도구로 Rust 함수를 파이썬 함수처럼 내보내고, maturin 으로 묶으면 pip install 한 줄로 설치되는 패키지가 돼요. 쓰는 사람은 속이 Rust 인 줄도 몰라요.
코드로 보면
Rust 쪽에서 함수 하나를 파이썬에 내보내는 모양이에요.
use pyo3::prelude::*;
#[pyfunction]
fn count_words(text: &str) -> usize {
text.split_whitespace().count() // 이 반복은 Rust 속도로 돈다
}
#[pymodule]
fn fastwords(m: &Bound<'_, PyModule>) -> PyResult<()> {
m.add_function(wrap_pyfunction!(count_words, m)?)?;
Ok(())
}maturin develop 로 빌드하면 파이썬에서는 이렇게 써요.
import fastwords
fastwords.count_words("파이썬은 지휘하고 Rust 는 연주한다") # → 5파이썬 쪽 코드는 그대로예요. 느린 한가운데만 Rust 로 갈아 끼운 거예요.
이미 쓰고 있는 Rust
"AI 에 Rust 라니 먼 얘기"처럼 들려도, 파이썬으로 AI 를 하는 사람이라면 이미 매일 Rust 를 돌리고 있어요.
| 도구 | 무엇 | Rust 가 맡은 부분 |
|---|---|---|
| Hugging Face tokenizers | 텍스트를 토큰으로 자르기 | 핵심 전부. 파이썬은 껍데기 |
| safetensors | 모델 가중치 파일 포맷 | 파일 읽기·쓰기. 복사 없이 메모리에 바로 비춰 읽음 |
| tiktoken | OpenAI 모델의 토크나이저 | 토큰화 엔진 |
| Polars | 데이터프레임(판다스 대체) | 엔진 전부. 여러 코어로 병렬 처리 |
| Pydantic v2 | 데이터 검증 | 검증 엔진(pydantic-core)을 Rust 로 다시 씀 |
| uv · Ruff | 파이썬 패키지 관리 · 린터 | 도구 전부 |
| Qdrant · LanceDB | 벡터 DB | DB 엔진 |
| Text Generation Inference | Hugging Face 의 LLM 추론 서버 | 요청을 받아 배치로 묶는 서버 쪽 |
| Candle · Burn | Rust 로 쓴 머신러닝 프레임워크 | 전부 — 파이썬 없이 추론까지 |
safetensors 는 속도만의 이야기가 아니에요. 예전 PyTorch 모델 파일(pickle)은 열기만 해도 그 안에 숨긴 코드가 실행될 수 있었어요. 남이 올린 모델을 내려받아 여는 게 곧 남의 프로그램을 실행하는 거였죠. safetensors 는 숫자 배열만 담는 단순한 포맷이라 그런 일이 생길 수 없어요. "빠르게"와 "안전하게"를 같이 노린 Rust 의 성격이 그대로 드러난 사례예요.
그럼 파이썬은 밀려나나
아니에요. 둘은 서로 다른 층에서 일해요.
- 연구 층 — 모델 구조를 바꿔 보고, 실험을 돌리고, 결과를 그래프로 그리는 곳이에요. 빨리 고쳐 보는 게 중요해서 파이썬이 계속 맞아요. 여기를 Rust 로 짜면 실험 한 번 할 때마다 컴파일러와 씨름해야 해요.
- 시스템 층 — 토큰화, 데이터 로딩, 파일 포맷, 추론 서버, DB 처럼 한 번 잘 만들어 두고 수백만 번 도는 곳이에요. 빠르고 안 죽는 게 중요해서, 원래 C++ 자리였고 지금은 Rust 가 많이 가져가고 있어요.
그래서 실제 모습은 "Rust 가 파이썬을 대체한다"가 아니라 "파이썬 겉, Rust 속" 이에요. 사람은 파이썬으로 말하고, 파이썬 패키지 속의 Rust 가 일해요. Rust 가 밀어내는 건 파이썬이 아니라 그 밑에 있던 C++ 의 일부예요.
파이썬은 무엇을 할지 말하고, Rust 는 그것을 빠르고 안전하게 한다.
그래서 언제 Rust 를 꺼내나
파이썬으로 일하는 입장에서 현실적인 순서는 이래요.
- 먼저 재 본다. 느린 곳이 정말 CPU 쪽 반복인지, 아니면 네트워크·디스크·GPU 대기인지부터 봐요. 짐작으로 갈아 끼우면 대개 헛수고예요.
- Rust 로 된 기존 도구를 먼저 쓴다. 판다스가 느리면 Polars, 토큰화가 느리면 tokenizers 처럼 이미 있는 걸 갈아 끼우는 게 제일 싸요. 직접 Rust 를 짤 필요가 없어요.
- 그래도 남는 한가운데만 직접 짠다. 수백만 번 도는 핵심 함수 하나를 PyO3 로 옮기고, 나머지는 파이썬에 둬요.
정리하면, AI 인프라가 Rust 로 가는 건 유행이 아니라 계산이에요. GPU 는 비싸고, 그 GPU 를 놀리지 않으려면 앞단의 CPU 일이 빨라야 하고, 그 코드는 수백만 번 돌아도 터지면 안 돼요. 그 세 조건을 한 언어로 맞춘 게 지금은 Rust 예요.
이 글은 영상 Why AI Infrastructure Is Moving to Rust(Byte Without Bite, 2026-10-15)의 흐름을 따라 정리했어요. 도구별 설명은 각 프로젝트의 공식 저장소를 기준으로 했어요 — tokenizers · safetensors · tiktoken · Polars · pydantic-core · PyO3 · maturin · Candle · Burn.
자주 묻는 것
Rust 함수를 파이썬에서 쓰려면 어떻게 하나요?
PyO3 로 Rust 함수를 파이썬 함수처럼 내보내고, maturin 으로 묶으면 pip install 한 줄로 설치되는 패키지가 돼요. 쓰는 쪽 파이썬 코드는 그대로예요.