모델별 실행 레시피

MLX-LM 3B 모델 실행과 속도 읽기: 첫 로딩, 프리필, 디코드, KV 캐시

첫 다운로드와 모델 로딩, 긴 입력을 읽는 시간, 답을 생성하는 시간은 서로 다른 대기입니다. 같은 조건으로 나누어 기록하세요.

공식 MLX-LM1 저장소가 기본 모델로 지정한 mlx-community/Llama-3.2-3B-Instruct-4bit를 Apple Silicon Mac의 가상 Python 환경에서 실행합니다. 3B 4비트는 문서에 있는 시작 모델이지 모든 Mac에 들어간다는 보장은 아닙니다. 첫 다운로드·모델 로딩, 긴 프롬프트를 읽는 프리필2, 토큰3을 생성하는 디코드4, 대화가 길어지며 늘어나는 KV 캐시5를 구분해 보세요. 측정할 때는 모델·프롬프트·출력 제한을 고정하고 콜드 시작과 웜 세션을 따로 기록합니다.

실행 조건과 핵심 내용
  • mlx-community/Llama-3.2-3B-Instruct-4bit는 MLX-LM 저장소가 기본으로 지정한 실제 모델 ID입니다. 3B 4비트는 모든 메모리 구성에서 실행된다는 뜻이 아닙니다.
  • 프롬프트를 읽는 프리필과 답을 생성하는 디코드, 첫 실행과 같은 세션의 후속 질문은 따로 기록해야 합니다.
  • KV 캐시와 함께 쓰는 앱도 통합 메모리를 사용합니다. 긴 문맥이나 캐시 제한은 답의 품질과 메모리 사용을 함께 바꿀 수 있습니다.

첫 실행이 느리면 모델이 느린 걸까요?

Apple Silicon Mac에서 모델을 처음 실행할 때는 파일을 내려받고, 가중치를 읽고, 입력을 처리한 뒤 답을 생성합니다. 한 번의 대기 시간에 이 과정이 모두 들어가면 어디에서 시간이 걸렸는지 알기 어렵습니다. 모델을 켜 둔 채 이어서 질문할 때는 이미 내려받은 파일과 실행 중인 프로세스를 재사용할 수 있습니다. 그래서 첫 실행의 대기와 대화 중 다음 답의 속도는 별도로 봐야 합니다.

이 글에서는 MLX-LM 공식 저장소가 기본 모델로 안내하는 mlx-community/Llama-3.2-3B-Instruct-4bit를 사용합니다. 모델 카드와 설정 파일에는 Llama 3.2 3B Instruct 구조와 4비트 양자화6 설정이 확인됩니다. 이 모델 ID는 공식 문서에 표시된 실행 예제를 재현할 때 쓸 수 있습니다. 이 예제로 얻는 동작 결과는 다른 모델 전체의 성능을 뜻하지 않으며, 더 큰 모델이나 다른 아키텍처에는 별도 확인이 필요합니다.

명령에 든 영어 프롬프트는 설치와 기본 생성이 되는지 확인하기 위한 것입니다. 한국어 답변 품질을 평가하는 시험은 아니므로, 실제 사용할 언어와 자료로 따로 확인해야 합니다.

먼저 호환되는 작은 실행 환경을 만듭니다

MLX-LM은 Python 패키지이므로 프로젝트별 가상 환경에 설치하면 기존 Python 작업을 분리해 둘 수 있습니다. 아래 명령은 가상 환경을 만든 뒤 공식 패키지를 설치하고, 짧은 입력으로 기본 생성을 확인하는 순서입니다. 설치가 실패하면 현재 공식 설치 안내와 사용 중인 환경을 확인하세요.

MLX7의 현재 공식 설치 문서는 Apple Silicon, ARM 네이티브 Python 3.10 이상, macOS 14.0 이상을 요구합니다. Rosetta로 Intel용처럼 실행되는 Python은 네이티브 환경과 다르므로, 패키지를 찾지 못하면 Python 아키텍처도 확인하세요.

명령의 --max-tokens 128은 생성할 답변 토큰의 상한입니다. 프롬프트까지 포함한 문맥 한도를 128로 고정한다는 뜻은 아닙니다. 값이 달라지면 허용하는 답변 길이와 총 생성 시간도 달라지므로 첫 비교에서는 바꾸지 않는 편이 좋습니다. 이 명령이 끝난 뒤 같은 명령을 다시 입력하면 프로세스가 새로 시작됩니다. 이미 모델이 켜진 세션의 후속 응답을 살펴보려면 mlx_lm.chat을 실행해 한 프로세스 안에서 질문해야 합니다.

가상 환경 설치와 첫 생성
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install mlx-lm
mlx_lm.generate --model mlx-community/Llama-3.2-3B-Instruct-4bit --prompt "Explain why prompt length affects generation time in two sentences." --max-tokens 128
공식 기본 모델 ID를 사용해 짧은 응답부터 확인합니다.

3B 4비트는 시작 크기이지 메모리 보증이 아닙니다

모델 이름의 3B는 대략적인 파라미터 규모를, 4bit는 가중치를 표현하는 정밀도 설정을 가리킵니다. 양자화는 가중치에 필요한 메모리를 줄이는 데 도움이 되지만, 실제 실행에는 모델의 메타데이터와 임시 계산 공간도 필요합니다. 답을 생성하면 KV 캐시가 추가되고, 긴 입력일수록 프리필 과정에서도 메모리 여유를 더 요구할 수 있습니다. 파일을 내려받을 디스크 공간과 실행 중 필요한 통합 메모리8도 서로 다른 자원입니다.

따라서 이 모델을 ‘3B니까 8GB Mac에서 된다’처럼 기억하지 마세요. Mac마다 통합 메모리 용량과 macOS가 쓰는 양이 다르고, 브라우저·개발도구·화상회의 앱처럼 함께 열린 프로그램도 공간을 차지합니다. 실행 전 Activity Monitor의 메모리 압력과 사용 중인 앱을 확인하고, 필요한 자료를 저장한 뒤 한 번의 짧은 프롬프트로 시작하세요. 메모리 압력이 계속 높아지거나 앱이 멈추면 문맥을 줄이고 다른 앱을 닫아 확인합니다. 크래시가 생겼다면 같은 조건에서 반복하기보다 먼저 사용 가능한 메모리를 늘리거나 더 작은 호환 모델로 바꾸세요.

나무 블록 더미와 두꺼워지는 공책, 전화기가 하나의 나무 쟁반 위에 놓여 있습니다.
가중치뿐 아니라 문맥과 다른 앱도 통합 메모리를 씁니다.

입력을 읽는 시간과 답을 쓰는 시간은 다릅니다

모델은 먼저 프롬프트를 토큰 단위로 읽고 내부 표현을 계산합니다. 이 입력 처리 단계를 프리필이라고 부릅니다. 짧은 질문보다 긴 문서 요약 요청에서 프리필이 길어질 수 있는 이유죠. 그 뒤에는 모델이 출력 토큰을 하나씩 생성하는 디코드 단계가 이어집니다. 문서가 길면 첫 토큰까지 오래 기다릴 수 있고, 답을 길게 요청하면 토큰을 만드는 작업이 오래 계속될 수 있습니다. 둘 다 ‘응답이 느리다’고 느껴지지만 원인과 손댈 설정은 다릅니다.

반복 실험에서는 같은 모델, 같은 프롬프트, 같은 출력 제한을 유지합니다. 처음 한 번은 파일 다운로드와 모델 로딩을 포함한 콜드 시작으로 따로 기록합니다. 이어서 모델이 살아 있는 동일한 mlx_lm.chat 세션에서 첫 질문과 후속 질문을 관찰하면, 프로세스를 다시 시작하는 대기와 세션 안에서 이어지는 작업을 구분할 수 있습니다. 단, 후속 질문에는 앞 대화 문맥이 붙을 수 있으므로 입력 길이가 같지 않다면 동일한 프리필 실험은 아닙니다. 새로 시작한 세션과 같은 세션의 값을 한 표에 섞지 마세요.

생성 중에 표시되는 프롬프트 처리 속도와 생성 속도가 있다면 각각 입력 토큰과 출력 토큰 단위로 기록합니다. 속도 숫자만 적지 말고, 모델을 새로 불렀는지, 입력이 어느 정도였는지, 출력 제한을 얼마로 두었는지, 다른 앱을 켰는지도 함께 적습니다. 사용한 MLX-LM 버전과 macOS, Mac 칩·메모리 구성도 적어야 뒤에서 같은 조건을 다시 만들 수 있습니다. 공개 벤치마크와 비교할 때는 모델 ID, 양자화, 입력 길이, 측정 구간이 같은지 확인하세요.

책상 위 노트북과 종이의 배치가 세 장면으로 이어지며, 처음에는 닫힌 화면이고 뒤에는 열려 있습니다.
모델을 여는 대기, 입력 처리, 토큰 생성을 따로 봅니다.

문맥과 KV 캐시는 메모리 선택을 바꿉니다

같은 모델이라도 대화가 길어지면 이전 토큰의 키와 값 정보를 보관하는 KV 캐시가 커질 수 있습니다. 그래서 짧은 질문에 성공했다고 해서 긴 문서 몇 개를 넣어도 같은 메모리 여유가 남는다고 볼 수 없습니다. 출력 길이도 중요합니다. 긴 답을 허용하면 생성 토큰이 계속 추가되어 캐시와 작업 시간이 늘어납니다. 처음에는 짧은 입력과 짧은 출력을 사용하고, 필요할 때 한 조건씩 늘려 어느 단계에서 압박이 시작되는지 확인하세요.

MLX-LM의 --prefill-step-size는 긴 프롬프트를 처리하는 묶음 크기를, --max-kv-size는 지원되는 캐시 구성의 상한을 조절합니다. 공식 문서는 프리필 묶음을 줄이면 입력 처리 중 최고 메모리를 낮출 수 있지만 처리 속도는 느려질 수 있다고 설명합니다. 회전형 KV 캐시의 한도를 낮추면 RAM9 사용을 줄일 수 있는 대신, 오래된 문맥을 보존하지 못해 답의 품질에 영향을 줄 수 있습니다. 다음 값은 옵션 사용법을 보여 주는 예일 뿐, 모든 Mac이나 모델의 권장값은 아닙니다.

비교할 때는 두 값을 한꺼번에 바꾸지 말고, 먼저 --prefill-step-size만 조절해 프리필 시간과 메모리 압력을 확인하세요. 원래 설정으로 되돌린 뒤 --max-kv-size를 따로 바꾸고 같은 질문의 문맥 유지와 답변 품질을 비교합니다. 이 옵션들은 무조건 켜야 하는 성능 버튼이 아니라 메모리·처리 시간·문맥 유지 사이의 선택입니다.

긴 대화를 무조건 유지해야 한다면 캐시를 자르기 전에 더 짧은 입력으로 기준 실행을 만들고, 품질이 달라지는지 같은 질문으로 비교하세요. 답이 짧게 끊기거나 이전 지시를 잊는 현상은 속도가 빨라졌다는 증거가 아닙니다. 필요한 문맥 길이와 품질을 만족하지 못하면 캐시 한도를 원래대로 돌리고, 더 작은 모델을 고르거나 메모리 여유가 더 큰 장비를 고려하는 편이 맞을 수 있습니다.

옵션을 보여 주는 예시 명령
mlx_lm.generate --model mlx-community/Llama-3.2-3B-Instruct-4bit --prompt "Summarize this short note." --max-tokens 128 --prefill-step-size 512 --max-kv-size 4096

나에게 맞는 속도인지 어떻게 판단할까요?

한 번의 전체 실행 시간보다 실제로 자주 겪는 대기 구간을 기준으로 보세요. 앱을 닫거나 컴퓨터를 재시작해 모델 프로세스를 자주 새로 여는 사람은 가중치를 다시 읽는 로딩 시간을 자주 겪습니다. 모델을 한 세션 동안 켜 둔 채 여러 번 묻는 사람은 후속 질문의 프리필과 디코드를 더 자주 경험합니다. 긴 보고서를 넣고 한두 문장 답을 기다리는 작업과, 짧은 질문으로 긴 초안을 요청하는 작업도 서로 다른 단계에 시간을 씁니다. 하나의 평균 속도 숫자로 모두 설명하기 어려운 이유입니다.

가능하면 워밍업 뒤 같은 조건을 세 번 실행해 중앙값을 씁니다. 한 번만 유독 빠르거나 느렸던 결과의 영향을 줄이기 위해서입니다. 콜드 시작, 웜 세션, 프리필, 디코드, 피크 메모리를 각각 기록하고 모델·입력·출력 제한·버전·함께 켠 앱도 남겨 두면 나중에 설정을 바꾼 뒤 같은 조건으로 다시 비교할 수 있습니다.

이 예시에서는 MLX-LM 공식 3B 4비트 체크포인트10로 짧은 대화를 먼저 끝까지 실행합니다. 메모리 압력이 안정적이면 실제 문맥·출력 길이를 한 번에 하나씩 늘리고, 매번 답의 품질과 메모리 상태를 확인하세요. 짧은 시험에서 메모리가 부족하거나 필요한 모델이 지원되지 않으면 그 지점에서 멈추고 더 작은 지원 모델이나 다른 엔진을 선택합니다. 속도를 비교할 때는 같은 입력으로 첫 로딩, 세션 내 후속 응답, 메모리 여유를 따로 기록해야 합니다. 이 결과가 자신의 작업에서 버틸 수 있는지 판단 근거가 됩니다.

빈 줄이 그어진 공책 옆에 같은 크기의 카드 세 장과 여러 작은 쟁반이 정돈되어 있습니다.
모델과 입력을 고정하고 대기 구간을 나누어 반복합니다.

용어 각주

  1. MLX-LM — MLX를 사용해 언어 모델을 불러오고 추론·미세 조정을 수행하는 패키지입니다. MLX 프레임워크 자체나 모든 MLX 기반 앱을 뜻하지는 않습니다.

    본문으로 돌아가기
  2. 프리필 — LLM이 입력 프롬프트를 읽고 각 토큰의 내부 표현을 계산하는 단계입니다. 입력이 길수록 처리할 토큰이 많아집니다.

    본문으로 돌아가기
  3. 토큰 — 모델이 입력이나 출력을 나누어 처리하는 단위입니다. 토큰 하나가 글자 하나나 일정한 시간 길이에 해당하지는 않습니다.

    본문으로 돌아가기
  4. 디코드 — LLM에서는 입력 처리 뒤 출력 토큰을 생성하는 단계를 뜻합니다. VAE나 오디오 코덱에서는 압축 표현이나 인코딩 데이터를 원래 형식으로 복원하는 처리를 가리킬 수 있습니다.

    본문으로 돌아가기
  5. KV 캐시 — 어텐션에서 이전 토큰의 키·값을 저장해 다음 토큰 생성 때 재사용하는 메모리입니다. 문맥 길이와 배치 크기에 따라 용량이 달라집니다.

    본문으로 돌아가기
  6. 양자화 — 모델의 수치를 더 적은 비트로 표현하는 방법입니다. 메모리 사용량과 함께 정확도나 실행 속도도 달라질 수 있으며, 영향은 형식과 구현에 따릅니다.

    본문으로 돌아가기
  7. MLX — Apple이 개발하는 머신러닝 프레임워크입니다. Apple silicon에서는 통합 메모리와 Metal을 활용하며, 별도로 Linux 실행 경로도 제공합니다. 지원 모델과 기능은 MLX 기반 도구마다 다릅니다.

    본문으로 돌아가기
  8. 통합 메모리 — CPU와 GPU가 같은 물리 메모리 풀을 공유하는 구조입니다. 메모리 용량이 자동으로 늘어나는 것은 아니며, 실제 사용 가능량은 시스템에 따라 다릅니다.

    본문으로 돌아가기
  9. 시스템 RAM — 프로그램이 실행되는 동안 데이터를 임시로 보관하는 시스템 메모리입니다. 저장장치나 독립 GPU의 VRAM과는 다릅니다.

    본문으로 돌아가기
  10. 체크포인트 — 학습된 모델의 가중치 등을 저장한 파일입니다. 같은 모델 계열도 버전이나 용도에 따라 다른 체크포인트를 쓸 수 있습니다.

    본문으로 돌아가기