오프라인 엣지 AI 챗봇 + 임베디드 리눅스 병행 로드맵
최종 목표
Raspberry Pi 5 (8GB)
├── 인터넷 없이 동작
├── 마이크로 음성 입력 (Whisper)
├── LLM 추론 (llama.cpp)
└── 스피커 or UART로 응답 출력
1주차: 환경 세팅 + 리눅스 기초
임베디드 리눅스 파트
- Raspberry Pi OS 설치 및 기본 세팅
- 크로스 컴파일 환경 구축 (호스트 PC에서 빌드 → Pi로 전송)
- Makefile, gcc, ssh, scp 워크플로우 익히기
- /dev, /proc, /sys 구조 탐색
프로젝트 파트
- llama.cpp 클론 & 빌드 (Pi 5에서 직접)
- 경량 모델 다운로드 및 첫 실행
- 추천: Qwen2.5-0.5B-Instruct Q4_K_M (약 400MB)
- 터미널에서 텍스트 입력 → 응답 출력 확인
1주차 체크포인트: Pi 터미널에서 LLM과 대화 성공 ✅
2주차: 시스템 프로그래밍 + C API 연동
임베디드 리눅스 파트
- 파일 I/O (open, read, write)
- 프로세스 & 파이프 (fork, pipe, popen)
- 시그널 처리 (SIGINT, SIGTERM)
- 공유 메모리 / 소켓 기초
프로젝트 파트
- llama.cpp C API (llama.h) 직접 사용해서 나만의 프로그램 작성
- 시스템 프로그래밍으로 배운 파이프/프로세스로 모듈화
// 이런 구조로 직접 작성
llama_context *ctx = llama_new_context(...);
llama_eval(ctx, tokens, n_tokens, ...);
// 토큰 하나씩 스트리밍 출력
2주차 체크포인트: 직접 짠 C 프로그램으로 LLM 응답 출력 ✅
3주차: 디바이스 드라이버 + 오디오 입력
임베디드 리눅스 파트
- 커널 모듈 Hello World (insmod/rmmod)
- 문자 디바이스 드라이버 작성
- ALSA 오디오 서브시스템 구조 이해
- /dev/snd 디바이스 파일 직접 읽기
프로젝트 파트
- USB 마이크 연결 → ALSA로 녹음 (arecord)
- Whisper.cpp 빌드 & 실행 (오프라인 STT)
- 파이프라인 연결: 마이크 → Whisper → 텍스트
[마이크] → arecord → whisper.cpp → 텍스트 → llama.cpp → 응답
3주차 체크포인트: 말하면 텍스트로 변환되어 LLM에 전달 ✅
4주차: 통합 + 시스템 최적화
임베디드 리눅스 파트
- 부팅 시간 최적화 (systemd 서비스 등록)
- 메모리 사용량 분석 (/proc/meminfo, valgrind)
- 로그 시스템 구성 (syslog, journalctl)
- 크래시 대응 (watchdog 데몬)
프로젝트 파트
- 전체 파이프라인 하나의 C 프로그램으로 통합
- 부팅 시 자동 실행 (systemd 서비스 등록)
- 응답 속도 최적화 (스레드, 배치 사이즈 튜닝)
- (여유되면) TTS 추가 → 스피커로 음성 출력 (piper-tts)
4주차 체크포인트: Pi 전원 켜면 자동으로 오프라인 챗봇 실행 ✅
전체 아키텍처 (완성 시)
┌─────────────────────────────────┐
│ Raspberry Pi 5 │
│ │
│ [마이크] → whisper.cpp (STT) │
│ ↓ │
│ llama.cpp (LLM 추론) │
│ ↓ │
│ [스피커] ← piper-tts (TTS) │
│ │
│ systemd로 부팅 시 자동 실행 │
│ 인터넷 연결 없음 │
└─────────────────────────────────┘
주차별 한눈에 보기
주차 리눅스 공부 프로젝트
| 1주 | 환경 세팅, 파일시스템 | llama.cpp 첫 실행 |
| 2주 | 시스템 프로그래밍 | C API로 LLM 제어 |
| 3주 | 드라이버, ALSA | Whisper STT 연결 |
| 4주 | 최적화, systemd | 전체 통합 & 자동실행 |