동식이 블로그

[Android] 온디바이스 AI 삽질기 - 5편: 파인튜닝 모델을 Android에 올리기 (변환 삽질기)

safetensors → tflite → .task → adb push, 중간에 막히는 게 한두 개가 아니다

[Android] 온디바이스 AI 삽질기 - 5편: 파인튜닝 모델을 Android에 올리기 (변환 삽질기) 학습은 끝났다. 이제 기기에 올리기만 하면 된다. — 라고 생각했다. 변환이 왜 필요한가 파인튜닝이 끝나면 모델은 HuggingFace 형식의 .safetensors 파일로 저장된다. 그런데 이걸 Android에서 바로 쓸 수는 없다...

[Android] 온디바이스 AI 삽질기 - 4편: QLoRA 파인튜닝 실전, loss가 안 내려가면 어떡하나

밤에 스크립트 돌려놓고 다음 날 아침에 확인하는 삶

[Android] 온디바이스 AI 삽질기 - 4편: QLoRA 파인튜닝 실전, loss가 안 내려가면 어떡하나 학습 돌려놓고 다음 날 확인했더니 loss가 그대로였다 드디어 학습을 돌린다 환경도 세팅했고 데이터도 준비했다. Phase 1 학습 스크립트를 돌렸다. 1 python train_phase1.py 로그가 흘러나오기 시작했다....

[Android] 온디바이스 AI 삽질기 - 3편: M1 Mac Mini 16GB로 LLM 파인튜닝 환경 세팅

24GB도 아니고 M1 16GB로 1B 모델 파인튜닝 — 되긴 된다

[Android] 온디바이스 AI 삽질기 - 3편: M1 Mac Mini 16GB로 LLM 파인튜닝 환경 세팅 클라우드 GPU 빌리면 되지 않냐고? 일단 집에 있는 걸로 해봤다. 왜 로컬인가 파인튜닝 환경은 크게 두 가지 선택지가 있다. Google Colab / 클라우드 GPU — NVIDIA GPU 환경, 세팅 간단, 비용 발생...

[Android] 온디바이스 AI 삽질기 - 2편: 학습 데이터 5만건, Gemini CLI로 하루 만에 만들기

실제 데이터는 못 쓰고, Claude는 비싸고, 그래서 Gemini CLI headless 호출

[Android] 온디바이스 AI 삽질기 - 2편: 학습 데이터 5만건, Gemini CLI로 하루 만에 만들기 파인튜닝을 하려면 데이터가 필요하다. 그런데 데이터가 없다. 학습 데이터 문제 모델도 정했다. 이제 학습을 돌리면 되는데, 문제가 하나 있었다. 학습 데이터가 없다. 파인튜닝은 이런 입력이 오면 이렇게 답해라, 라는 예시 쌍...

[Android] 온디바이스 AI 삽질기 - 1편: AI를 모르는 안드로이드 개발자가 LLM에 손댄 이유

Claude한테 물어보면 되겠지 — 라고 시작했다

[Android] 온디바이스 AI 삽질기 - 1편: AI를 모르는 안드로이드 개발자가 LLM에 손댄 이유 ML도 모르고, 파이썬도 어색한데 LLM을 파인튜닝해보겠다고 나선 이야기 시작하기 전에 이 시리즈는 AI/ML 전문가가 쓰는 글이 아니다. 안드로이드 앱만 만들던 개발자가 온디바이스 AI 기능을 앱에 붙여보자는 목표 하나로 시작해서,...

[Android] NestedScrollWebView

WebView 중첩스크롤 문제 해결

[Android] NestedScrollWebView 이슈가 많은 웹뷰 화면 스크롤링과 스와이프 문제 해결 문제가 되는 기존 구조는 다음과 같다. 문제점 1. 가로스크롤 바 WebView의 가로스크롤은 ScrollView의 최하단에 나타남 문제점 2. WebView 확대 WebView 확대시 내용이 잘려서 보임 문...

[Android] ContentValues Class

ContentValues Class

[Android] ContentValues Class *MediaStore* 를 통해 데이터를 저장하기 전, ContentValues Class에 대해 알아보기 android.content.ContentValues.java에 들어가보면 This class is used to store a set of values that the Conte...

[Android] Bitflag ?

Bitflag 공부

[Android] Bitflag ? 공부공부 비트 플래그(Bitflags)는 하나의 정수 변수를 사용하여 여러 가지 상태를 표현하는 기법이다. 이는 변수 내에서 각 Bool 값에 고유한 비트 위치를 할당해 사용하게된다. 예를 들어 메모리의 최소 크기 단위는 1바이트이므로 변수의 크기는 적어도 1바이트 이상이다. 8비트(1바이트)는 비트가 ...

[Android] Task Hijacking 취약점 CVE-2021-33699

CVE-2021-33699 Task Hijacking

[Android] Task Hijacking 취약점 CVE-2021-33699 이전 글이 새해 첫글!!! 이거네…너무 오랜만에 남기는 글… CVE-2021-33699 안드로이드 Task Hijacking 취약점(CVE-2021-33699)은 2021년 6월에 발견된 안드로이드 운영체제의 보안 취약점 중 하나로, 이 취약점은 악의적인 앱이 ...

[Android] Shared Preference 암호화

EncryptSharedPerference, KeyStore, RSA

[Android] Shared Preference 암호화 새해 첫 글 !! 앱내에 데이터를 캐싱할때 Room을 사용해서 저장하거나, SharedPreference로 값을 저장하곤 한다. SharedPreference를 사용하면 1 2 3 <map> <string name="lastSync">16727141076...