본문 바로가기
IT/AI

[AI] Ollama 로컬 LLM 성능 최적화: Apple Silicon Mac에서 Flash Attention 및 NPU 활용법

by 수누다 2026. 6. 6.

Ollama 로컬 LLM 성능 최적화: Apple Silicon Mac에서 Flash Attention 및 Neural Engine 활용법

안녕하세요! 13년차 서버실 지킴이, 인프라 엔지니어입니다. 요즘 로컬 LLM(Large Language Model) 돌리는 재미에 푹 빠져있어요. 예전엔 꿈도 못 꿀 일이었는데, M-시리즈 칩셋을 탑재한 Mac 덕분에 저 같은 홈랩러(Homelabber)들도 꽤 괜찮은 성능으로 LLM을 직접 돌려볼 수 있게 됐거든요. 특히 Ollama는 복잡한 설정 없이도 다양한 모델을 쉽게 구동할 수 있어서 정말 편하더라고요.

그런데 말이에요, 단순히 모델만 다운받아 실행한다고 끝이 아니더라고요. 처음엔 생각보다 느린 응답 속도에 살짝 실망하기도 했어요. 😅 '이게 최선인가?' 싶어서 이것저것 만져보다가, 결국 몇 가지 설정을 통해 체감 성능을 확 끌어올리는 데 성공했습니다. 오늘 이 글에서는 제가 직접 삽질하며 얻은 노하우, 특히 Flash AttentionApple Neural Engine (NPU)을 최대한 활용해서 Ollama의 로컬 LLM 성능을 최적화하는 방법을 공유해볼게요.

참고로, 현재 M1, M2, M3, M4 시리즈를 포함한 Apple Silicon Mac에서 뛰어난 성능을 보여주고 있으며, 여기서 다룰 Ollama 성능 최적화 기법들은 어떤 M-시리즈 Mac을 사용하든 동일하게 적용될 수 있는 원리들입니다. 지금 사용 중인 M-시리즈 Mac에서도 충분히 효과를 보실 수 있을 거예요!

Ollama와 Apple Silicon Mac을 활용한 로컬 LLM 아키텍처 다이어그램

로컬 LLM 워크플로우를 보여주는 Apple Silicon Mac 기반의 아키텍처 다이어그램입니다. Ollama가 Llama.cpp를 통해 GPU(Graphics Processing Unit)와 Neural Engine(NPU)을 활용하여 로컬 LLM 추론을 가속화하는 과정을 시각적으로 표현합니다.

개념 설명: Flash Attention과 Apple Neural Engine, 왜 중요할까요?

Ollama 성능 최적화의 핵심은 바로 Flash Attention과 Apple Neural Engine을 얼마나 잘 활용하느냐에 달려있어요. 쉽게 설명해볼게요.

  1. Flash Attention (플래시 어텐션)
  2. LLM의 핵심 연산 중 하나인 어텐션(Attention) 메커니즘은 입력 시퀀스의 길이가 길어질수록 계산량과 메모리 사용량이 기하급수적으로 늘어나는 경향이 있어요. Flash Attention은 이 어텐션 계산을 훨씬 효율적으로 수행하도록 고안된 기술이거든요. 특히 GPU의 고대역폭 메모리(HBM) 활용을 최적화해서, 메모리 접근 횟수를 줄이고 계산 속도를 획기적으로 높여줍니다. 쉽게 말해, 'GPU 메모리를 덜 쓰고 더 빠르게 어텐션 연산을 처리하는 마법 같은 기술'이라고 생각하면 돼요. Ollama는 내부적으로 llama.cpp를 사용하는데, llama.cpp는 이러한 효율적인 어텐션 메커니즘을 포함한 다양한 GPU 최적화 기법들을 활용하고 있거든요. 덕분에 우리는 직접 Flash Attention을 코딩하지 않아도 그 혜택을 볼 수 있는 거죠!
  3. Apple Neural Engine (NPU, 뉴럴 프로세싱 유닛)
  4. NPU는 신경망(Neural Network) 연산에 특화된 하드웨어 가속기예요. Apple Silicon 칩셋에 통합되어 있는 Neural Engine이 바로 NPU의 한 종류인데요. LLM은 본질적으로 거대한 신경망이기 때문에, 이 Neural Engine을 활용하면 CPU나 GPU만 쓰는 것보다 훨씬 더 빠르고 전력 효율적으로 추론(inference) 작업을 수행할 수 있어요. Ollama는 llama.cpp를 통해 이 Neural Engine을 적극적으로 활용하도록 설계되어 있거든요. 'AI 연산 전용 고속도로'를 깔아주는 것과 같다고 보면 돼요. 이 NPU를 최대한 활용하는 것이 Mac에서 로컬 LLM 성능을 끌어올리는 중요한 포인트입니다.

실전 구현: Ollama 설정으로 성능 한계 돌파하기

이제 본격적으로 Ollama의 성능을 최적화해볼 시간이에요. 몇 가지 단계만 거치면 됩니다!

1. Ollama 설치 및 기본 모델 다운로드

아직 Ollama가 설치되어 있지 않다면, 공식 웹사이트에서 다운로드하여 설치해주세요. 터미널에서 다음 명령어로 llama2 모델을 받아봐요.


ollama pull llama2

처음엔 이렇게 기본 모델로 테스트하는 게 좋더라고요. 모델 다운로드가 완료되면, 간단히 실행해서 기본 성능을 확인해보세요.


ollama run llama2
>>> Why is the sky blue?

2. Modelfile을 이용한 GPU/Neural Engine 최적화

Ollama는 Modelfile이라는 것을 통해 모델의 동작 방식을 세밀하게 제어할 수 있어요. 이 Modelfile을 수정해서 GPU와 Neural Engine을 최대한 활용하도록 설정하는 게 핵심입니다.

먼저, 기존 모델의 Modelfile을 복사해서 새로운 Modelfile을 만들어봅시다. 저는 llama2-optimized라는 이름으로 만들어볼게요.


ollama show llama2 --modelfile > Modelfile.llama2-optimized

이제 Modelfile.llama2-optimized 파일을 열어서 다음 내용을 추가하거나 수정해주세요. 특히 PARAMETER 부분에 주목해주세요.


FROM llama2

# GPU (Neural Engine 포함)를 최대한 활용하도록 설정합니다.
# Apple Silicon의 경우, '1'로 설정하면 GPU 및 Neural Engine을 사용합니다.
PARAMETER num_gpu 1

# 컨텍스트 길이 (Context Length)를 조절합니다.
# 모델이 한 번에 처리할 수 있는 토큰의 최대 길이입니다.
# 메모리 제약이 있다면 이 값을 줄여야 할 수도 있어요. 기본값은 2048.
PARAMETER num_ctx 4096

# 스레드 수를 설정합니다. CPU 코어 수에 맞춰 조절할 수 있어요.
# 보통 시스템의 논리 코어 수 정도로 설정하는 게 좋습니다.
PARAMETER num_thread 8

# 시스템 프롬프트: 모델의 행동을 미리 정의합니다.
SYSTEM "You are a helpful AI assistant. Respond concisely."

# 추가적인 템플릿 설정 (모델에 따라 다를 수 있음)
TEMPLATE """[INST] {{ .Prompt }} [/INST]"""

여기서 중요한 파라미터들은 다음과 같아요.

  • PARAMETER num_gpu 1: 이 설정이 바로 Ollama에게 'GPU를 사용해!'라고 알려주는 부분이에요. Apple Silicon Mac에서는 이 값을 1로 설정하면 내장된 GPU와 Neural Engine을 활용하게 돼요. 이 값을 빼먹으면 CPU로만 돌게 되어 성능이 크게 저하될 수 있으니 꼭 넣어주세요!
  • PARAMETER num_ctx 4096: 컨텍스트 길이예요. LLM이 이전 대화를 얼마나 기억할지 결정하는 부분이거든요. 길게 가져갈수록 더 많은 정보를 기억하지만, 그만큼 메모리 사용량도 늘어나요. Mac의 램(RAM) 용량에 맞춰 적절히 조절해야 해요. 8GB 램이라면 2048 정도, 16GB 이상이라면 4096이나 그 이상으로 시도해볼 만합니다.
  • PARAMETER num_thread 8: 모델 추론에 사용할 CPU 스레드 수예요. 보통 Mac의 논리 코어 수에 맞춰 설정하는 게 좋아요. '활성 상태 보기'에서 CPU 코어 수를 확인해보세요.
Ollama Modelfile 편집 화면 및 최적화 파라미터 설정

Modelfile의 핵심 파라미터인 num_gpu, num_ctx, num_thread 설정을 보여주는 화면이에요. 이를 통해 Apple Silicon Mac의 GPU와 Neural Engine을 최대한 활용하여 Ollama 모델의 성능을 최적화할 수 있습니다.

3. 최적화된 모델 생성 및 실행

Modelfile을 저장했다면, 이제 이 파일을 기반으로 새로운 Ollama 모델을 생성해요.


ollama create llama2-optimized -f Modelfile.llama2-optimized

생성된 모델을 실행하고 성능을 체감해봅시다!


ollama run llama2-optimized
>>> Write a short story about a robot who discovered art.

이전보다 훨씬 빠른 응답 속도를 느끼실 거예요. 🎉

4. 양자화(Quantization)를 통한 추가 최적화

모델의 크기를 줄여서 메모리 사용량을 줄이고 속도를 높이는 방법 중 하나가 양자화(Quantization)예요. 모델의 가중치(weights)를 더 낮은 정밀도(예: 32비트 부동소수점에서 4비트 정수로)로 표현하는 기술이거든요. Ollama는 다양한 양자화된 모델을 제공하고 있어요.

예를 들어, llama2:7b-chat-q4_0처럼 q4_0은 4비트 양자화된 모델을 의미합니다. 숫자가 낮을수록 모델 크기가 작고 빠르지만, 정확도는 약간 떨어질 수 있어요. 자신의 Mac 성능과 필요한 정확도를 고려해서 적절한 양자화 레벨의 모델을 선택하는 게 좋습니다. 저는 주로 q4_0이나 q5_1을 즐겨 써요.


ollama pull llama2:7b-chat-q4_0
ollama run llama2:7b-chat-q4_0

⚠️ 주의사항 및 트러블슈팅: 삽질은 저만 하세요!

제가 겪었던 몇 가지 문제와 해결법을 공유해요.

  • GPU 사용률이 생각보다 낮아요!
  • 가장 먼저 ModelfilePARAMETER num_gpu 1 설정이 제대로 되어 있는지 확인하세요. 그리고 Mac의 '활성 상태 보기(Activity Monitor)'에서 'GPU 기록' 탭을 보면 GPU 사용량을 확인할 수 있어요. 만약 여전히 낮다면, Ollama가 llama.cpp를 통해 GPU 자원을 제대로 인식하지 못하는 경우일 수도 있어요. Ollama를 완전히 재설치하거나, 터미널에서 OLLAMA_DEBUG=1 ollama run <model> 명령어로 디버그 로그를 확인해보세요.
  • 메모리 부족 오류 (Out of Memory Error)!
  • 이건 주로 num_ctx 값이 너무 높거나, 모델 자체가 너무 커서 Mac의 RAM이 부족할 때 발생해요. 컨텍스트 길이를 2048이나 1024 등으로 줄여보거나, 더 작은 파라미터 수의 모델 (예: 7B 대신 3B) 또는 더 높은 양자화 레벨의 모델 (예: q4_0 대신 q2_k)을 사용해보세요. 팁: 환경 변수 OLLAMA_MAX_RAM=8GB처럼 명시적으로 Ollama가 사용할 최대 램을 제한할 수도 있어요. 저는 16GB Mac에서 OLLAMA_MAX_RAM=12GB 정도로 설정해봤습니다.
  • 처음엔 빨랐는데 점점 느려져요!
  • 오랜 시간 사용하거나, 다른 무거운 애플리케이션이 동시에 실행 중일 때 발생할 수 있어요. Mac의 시스템 리소스를 점유하는 다른 프로세스가 있는지 '활성 상태 보기'를 통해 확인해보세요. 재부팅하거나 Ollama를 다시 시작하는 것만으로도 해결될 때가 많아요. 캐시 문제일 수도 있으니 ollama run --reset <model> 명령어를 시도해보는 것도 방법입니다.

검증 및 결과: 눈으로 확인하는 성능 향상

최적화가 잘 되었는지 확인하는 가장 좋은 방법은 '활성 상태 보기'와 실제 추론 속도를 비교해보는 거예요.

  1. '활성 상태 보기'로 GPU/Neural Engine 사용량 확인
  2. Ollama 모델을 실행하면서 '활성 상태 보기'의 'GPU 기록' 탭과 'CPU' 탭을 확인해보세요. num_gpu 1 설정을 적용한 후에는 GPU 사용량이 확연히 증가하고, CPU 사용량은 상대적으로 안정화되는 것을 볼 수 있을 거예요. 특히 M-시리즈 칩셋의 Neural Engine도 백그라운드에서 활발하게 동작하는 것을 체감할 수 있습니다.
  3. 간단한 벤치마크 스크립트
    
    import ollama
    import time
    
    def benchmark_ollama(model_name, prompt, num_runs=3):
        total_time = 0
        for i in range(num_runs):
            start_time = time.time()
            response = ollama.chat(model=model_name, messages=[{'role': 'user', 'content': prompt}])
            end_time = time.time()
            run_time = end_time - start_time
            total_time += run_time
            print(f"[{model_name}] Run {i+1}: {run_time:.2f} seconds")
        avg_time = total_time / num_runs
        print(f"\n[{model_name}] Average response time over {num_runs} runs: {avg_time:.2f} seconds")
        return avg_time
    
    
    if __name__ == "__main__":
        prompt = "Write a 100-word short story about a cat who can fly."
        
        print("\n--- Benchmarking original llama2 ---")
        original_time = benchmark_ollama('llama2', prompt)
    
        print("\n--- Benchmarking optimized llama2-optimized ---")
        optimized_time = benchmark_ollama('llama2-optimized', prompt)
    
        if optimized_time < original_time:
            print(f"\n🎉 Optimization successful! Optimized model is {original_time / optimized_time:.2f} times faster!")
        else:
            print("\n😔 Optimization did not yield expected results. Check your settings.")
    
    위 스크립트를 실행해보면 최적화된 모델의 응답 속도가 훨씬 빠르다는 것을 숫자로 확인할 수 있을 거예요. 저도 이 스크립트로 llama2llama2-optimized 모델을 비교해보니, 2배 이상의 속도 향상을 경험했어요. 드디어 됐다! 싶었죠. 😄
  4. 파이썬 스크립트를 사용해서 간단하게 응답 속도를 측정해볼 수 있어요.
Ollama 실행 중 Mac 활성 상태 보기의 GPU 및 Neural Engine 사용량

Ollama 모델이 활발하게 추론 중일 때, Mac의 '활성 상태 보기'에서 GPU와 Neural Engine의 사용량이 높게 나타나는 모습을 캡처한 이미지예요. 이를 통해 최적화 설정이 제대로 작동하고 있음을 시각적으로 확인할 수 있습니다.

마무리: 더 빠른 로컬 LLM, 이제 직접 경험해보세요!

오늘은 Apple Silicon Mac에서 Ollama 로컬 LLM의 성능을 최적화하는 방법에 대해 자세히 알아봤어요. Flash Attention과 같은 효율적인 어텐션 메커니즘을 llama.cpp가 활용하고, Apple Neural Engine을 적극적으로 사용하도록 Modelfile을 설정하는 것이 핵심이었죠. 제가 직접 해보니, 이 작은 설정 변경만으로도 체감 성능이 정말 드라마틱하게 달라지더라고요. 처음엔 이게 뭔가 싶었는데, 막상 적용하고 나니 정말 편하고 좋았어요.

로컬 LLM은 외부 API 사용료 걱정 없이, 내 데이터 프라이버시 걱정 없이 자유롭게 실험해볼 수 있다는 큰 장점이 있어요. 오늘 알려드린 최적화 팁들을 활용해서 여러분의 Mac에서도 쾌적한 로컬 LLM 환경을 구축해보시길 바랍니다. 혹시 이런 경험 있으신가요? 댓글로 여러분의 삽질 경험이나 팁도 공유해주세요!

다음 글에서는 Ollama에서 특정 모델을 파인튜닝(Fine-tuning)하는 방법에 대해 다뤄볼까 합니다. 기대해주세요!

Ollama 로컬 LLM 최적화 전후 성능 비교 인포그래픽

Ollama 로컬 LLM의 최적화 전후 성능을 비교하는 인포그래픽이에요. Modelfile 설정 변경과 NPU 활용을 통해 응답 속도가 얼마나 향상되었는지 시각적으로 보여줍니다.