"Light don go": when Nigeria''s power cuts out, my laptop sends me outside
“전기가 나가면”: 나이지리아 정전 때 노트북이 저를 밖으로 보냅니다
나이지리아의 잦은 정전을 활용해 노트북 배터리 전환을 감지하고, 사용자가 잠깐 밖에 나가도록 안내하는 오프라인 도구를 만들었습니다. 코드가 사실과 수치를 맡고 로컬 Gemma가 짧은 문장만 쓰도록 분리한 설계와 실제 정전에서 발견한 문제를 소개합니다.
- 주제
AI 요약
나이지리아 포트하커트(Port Harcourt)에서는 전기가 나가면 선풍기와 공유기가 멈추고 노트북은 배터리로 전환됩니다. 저자는 발전기를 켜기 전까지 화면 앞에서 기다리는 대신, 그 시간을 밖에서 보내도록 돕는 도구 ‘Light don go’를 만들었습니다. 노트북이 30초 넘게 배터리 상태를 유지하면 화면 전체에 안내 페이지가 열립니다. 60초 스트레칭 타이머와 한 가지 외출 계획을 보여주며, 사용자가 “일어났어요. 닫아 주세요” 버튼을 누르면 끝납니다. 다음 정전 때까지 페이지는 다시 열리지 않습니다.
인터넷이 끊겨도 작동하는 구성
정전과 함께 공유기 전원도 끊기므로 네트워크 연결을 전제로 삼지 않았습니다. 전기가 들어오는 동안 Open-Meteo의 시간별 예보를 30분마다 저장하고, 정전 뒤에는 저장된 파일만 읽습니다. 일몰 시각은 NOAA의 태양 위치 계산식으로 노트북에서 구합니다. 포트하커트의 10월 7일 일몰은 계산값과 Open-Meteo에서 모두 18시 21분으로 나왔고, sunrise-sunset.org 결과는 18시 22분이었습니다.
배터리 상태는 psutil로 5초마다 확인합니다. 30초 미만의 짧은 전원 깜빡임은 무시하고, 15분 안에 두 번째 정전이 생기면 기록만 남겨 안내가 반복되지 않게 했습니다. 우기에는 시간당 강수 확률 50%만으로도 거의 모든 시간이 비 오는 시간으로 분류됐습니다. 그래서 비가 올 가능성을 70% 이상으로 보거나 예상 강수량이 0.5mm 이상일 때 실외 활동을 피하도록 기준을 바꿨습니다.
코드가 사실을 정하고, 모델은 말투만 담당합니다
초기 버전은 Gemma가 사실을 포함한 안내 전체를 작성했습니다. 테스트 4회에서 수치를 모두 빠뜨렸고, 두 번은 의미까지 뒤집었습니다. “전기가 돌아온 것 같다”는 문장과 발전기가 켜져 있지 않은데 “발전기가 멈추기 전에 노트북을 닫으라”는 문장이 나왔습니다. 수치 검사만으로는 이런 오류를 잡을 수 없었습니다.
그래서 역할을 나눴습니다. 코드가 시각, 비나 일몰까지 남은 시간, 절약한 나이라(Naira) 같은 사실을 담은 줄을 작성합니다. Gemma 4 E2B는 장소와 상황, 규칙으로 정한 활동만 보고 짧은 권유 문장을 씁니다. 숫자나 NEPA, 전기, 발전기를 언급하거나 20단어를 넘기면 검사가 문장을 거부합니다. 한 번 재시도한 뒤에도 통과하지 못하면 고정 문장을 보여줍니다. 모델 호출은 최대 두 번입니다. 변경 뒤 테스트 9회에서 모두 첫 시도에 통과했습니다. 다만 검사는 문장의 의미까지 판별하지 못합니다. “휴대전화 안에서 비를 보라”는 어색한 문장도 통과했습니다.
모델은 Ollama에서 CPU로 실행하는 Gemma 4 E2B QAT입니다. 4.3GB를 내려받아야 하며, NVIDIA GPU가 없는 i5-1135G7 노트북에서 차가운 시작은 14초, 따뜻한 상태는 3.6~4초, 생성 속도는 초당 약 15~20토큰이었습니다. 저자는 한 문장만 생성하므로 이 속도로 사용한다고 설명합니다.
실제 정전이 찾아낸 문제
첫 정전 때 모델 응답이 시간 초과됐습니다. 확인해 보니 Ollama가 5분 동안 쓰지 않은 모델을 메모리에서 내렸고, 정전 시점에는 다시 불러오는 중이었습니다. 정전 전에 실행한 워밍업은 약 30분 전이었습니다. 저자는 keep_alive: -1 설정으로 모델을 메모리에 계속 유지하도록 바꿨습니다. 모델은 15.7GB 메모리 중 3.9GB를 차지합니다. 다음 정전에서는 첫 시도에 응답했습니다.
이후 한 차례 더 시간 초과가 났지만 원인은 달랐습니다. Windows Modern Standby 상태에서 노트북이 잠들어 모델 호출 도중 다시 절전 상태로 들어갔습니다. 저자는 Windows 이벤트 로그로 이를 확인했습니다. 정전 상황을 시뮬레이션하는 것만으로는 발견하기 어려운 문제였습니다.
페이지는 정전 데이터를 JSON으로 넣은 단일 HTML 파일입니다. Edge를 전체 화면 앱 모드로 실행하고, 모델 문장은 HTML이 아닌 데이터로 넣습니다. </script>가 포함된 문장으로 페이지가 깨지지 않는지도 검사합니다. 네트워크 소켓을 모두 차단한 상태에서 정전 흐름을 끝까지 실행하는 테스트를 포함해 테스트 98개를 작성했습니다. 안전 검사 조건을 일부러 8번 약화하거나 제거했을 때도 테스트가 매번 실패하는지 확인했습니다.
저자는 이 도구를 나이지리아뿐 아니라 남아프리카공화국의 순환 정전(load-shedding), 인도와 파키스탄처럼 노트북으로 일하는 중 정전이 잦은 곳에서도 쓸 수 있다고 설명합니다. 실제 정전 때 안내를 따라 노트북을 닫고 동네를 걸으며 사촌과 아이들을 만났고, 전기는 몇 시간 뒤 돌아왔습니다.
dev.to 반응
- @fm — GPU가 없으면 Gemma는 너무 느립니다. E2B는 쓸 만하지만 이것도 느립니다. 잘되길 바랍니다 👍️
- @dannwaneri — 맞습니다. CPU에서는 느립니다. 제 i5에서 초당 15~20토큰이 나왔습니다. 여기서는 Gemma가 약 25토큰짜리 문장 하나만 쓰기 때문에 작동합니다. 실제 정전 때 호출은 6~9초 걸렸고, 짧은 깜빡임이 아닌지 확인하려고 이미 30초를 기다립니다. 채팅 앱이라면 GPU가 필요할 것 같습니다. Birds.Quest도 잘되길 바랍니다. “예측은 목격이 아닙니다”라는 규칙이 마음에 들었습니다.
- @fm — 저도 직접 겪고 나서야 알았습니다. 코어 4개, 3.4GHz인 i7에서도 지난 오후의 새 관찰 기록을 자동으로 쓰는 데 꽤 오래 걸렸습니다. 실제 서비스는 DigitalOcean Serverless GPU에서 실행할 예정이라 매번 몇 센트쯤 들 것 같습니다. 재미 삼아 10억 매개변수 미만 모델을 미세 조정해 볼까 합니다. 결과가 괜찮으면 올리겠습니다 🥰
- @dannwaneri — 오후 내내 걸은 기록은 제가 쓰는 한 문장보다 훨씬 길겠네요 😄 10억 매개변수 미만 모델 미세 조정도 재미있겠습니다. 블로그 문체만 학습한 작은 모델이라면 CPU에서도 빠를 수 있습니다. 결과를 올려 주세요. 보고 싶습니다!
- @fm — GPS를 입력하면 그 경로에서 볼 수 있는 새를 예측하는 다른 오픈 모델을 썼습니다. 모델 크기는 15MB뿐이고 저사양 휴대전화 브라우저에서도 돌아갑니다. 그걸 보고 아이디어를 얻었습니다. 15MB 모델이 그렇게 잘 예측한다면 300MB쯤 되는 모델도 게시물을 충분히 쓸 수 있을 것 같습니다.
- @dannwaneri — 15MB 모델이라니 인상적입니다! 정해진 종 목록에서 고르는 작업이라 잘하는 것 같습니다. 글쓰기는 답이 정해져 있지 않아 작은 모델이 실수하기 쉽습니다. Gemma E2B는 말투는 괜찮았지만 메시지 전체를 쓸 때 사실을 틀렸습니다. 코드가 사실을 제공하고 모델이 표현만 맡게 하면서 해결했습니다. 새 목록을 제공하는 15MB 모델도 이미 그 구조입니다. 목록을 표현하기만 하는 300MB 안팎의 모델은 잘 작동할 수도 있겠습니다.
- @xulingfeng — 글을 읽으니 얼마나 힘든지 알겠습니다. 기반 시설은 정말 큰 부담이네요. 여러분 나라의 전력 공급이 나아지길 바랍니다. 저는 20년 넘게 큰 정전을 겪지 않았습니다. 계속 잘해 나가세요 💪 행운을 빕니다!
- @dannwaneri — 감사합니다! 큰 정전 없이 20년을 보냈다니 여기서는 꿈같은 이야기입니다 😄 저희는 정전 상황에 맞춰 살아가는 법을 배웠습니다. 발전기를 기다리는 대신 정전 시간을 좋은 일로 바꿔 보려고 만든 프로젝트입니다. 읽어 주시고 응원해 주셔서 감사합니다!
- @tabban_ghani_ — 이번 기여물을 보니 정말 좋네요 🤩
- @dannwaneri — 감사합니다! 🙏 마음에 드셨다니 기쁩니다.
- @koda2026 — 제약을 고려한 로컬 우선 엔지니어링의 교본입니다. 150달러짜리 휴대전화에서 AI 도구를 만드는 사람으로서 설계 선택이 정말 마음에 듭니다. 코드가 사실과 수치, 시각, 절약한 나이라를 맡고 Gemma가 표현만 담당하게 나눈 방식이 훌륭합니다. 작은 로컬 모델은 말투를 살리고 사실 환각은 막는 방식으로 쓰는 게 정확합니다. 숫자와 특정 키워드를 거르는 가드레일도 단순하고 효과적입니다. 실제 정전에서 콜드 스타트 시간 초과를 발견한 일도 시뮬레이션으로는 얻기 어려운 경험입니다. 전기가 나갔을 때 작동하도록 모델 3.9GB를 메모리에 유지한 점도 훌륭한 시스템 설계입니다. 매일 겪는 좌절을 의도적인 휴식 시간으로 바꾼 점도 멋집니다. 계속 만들어 주세요! 💻🌍
- @dannwaneri — 감사합니다, Harun! 🙏
keep_alive문제는 발견하기 힘들었지만 심사위원이 아니라 실제 정전이 잡아줘서 다행입니다. 가드는 완벽하지 않습니다. 숫자와 주제에서 벗어난 단어는 잡지만 의미는 확인하지 못해서 가끔 이상한 문장이 통과합니다. 150달러짜리 휴대전화에서는 어떤 AI 도구를 실행하시나요?
- @dannwaneri — 감사합니다, Harun! 🙏
원문: dev.to / 번역·요약: Trawling