안녕하세요,
한국어 LLM 연구하는 Beomi입니다.
이전에 쓴 3개 글을 통해서(출시 글은 홍보성 게시글이라고 삭제되었더라구요..ㅡㅜ) 많은 분들께 온라인 AI 스팸 차단기능이 들어간 앱을 소개해드렸는데요.
아무래도 애플유저들(저를 포함한)이 개인정보를 보다 소중히 여긴다는 점을 공감하고 있기 때문에,
휴대폰 내에서만 동작하는 온디바이스 AI에 대한 요청이 많았습니다.
Apple은 생각보다 온디바이스 AI에 진심인 회사인데요. 2017년도부터 "Core ML"이라는 이름으로 머신러닝 Accelerate를 할 수 있는 프레임워크를 제공해왔습니다.

온디바이스에서 동작하는 AI의 경우는 사실 모바일 칩셋의 성능도 성능이지만 배터리 문제가 큰 편인데요.
단순히 CPU 혹은 GPU 가속을 Metal API를 통해 사용하는것과는 다른 방식을 사용합니다.

Metal API의 경우는 Graphics 즉 아이폰 칩셋 내의 GPU에 Low-level로 접속해서 최고의 성능을 이끌어내는 것을 목표로 하는데요.
실제 최근 앱스토어에 간간히 올라오는 온디바이스 Stable Diffusion(그림그리는 앱) 혹은 최근의 언어모델 7B급의 모델을 구겨넣는 경우는 배터리를 엄청 사용한다 하더라도 일단 '돌아간다'에 의의를 두고 있기 때문에 보통의 경우 상시 동작하는 AI를 가정하지 않습니다.
또한, 사용자에게 최대한의 성능을 제공해줘야하니 당연히 발열도 엄청나구요.

위 스크린샷에서 "모델을 Core ML로 변환"이라는 부분이 있는데요.
딥러닝 개발/연구 할 때 가장 많이 쓰는 프레임워크가 PyTorch라는 프레임워크입니다.
하지만 해당 코드는 파이썬으로 작성되어있고, 그 뒷단에는 C++로 구성된 CUDA기반의 커널들이 존재합니다.
따라서 해당 코드를 곧바로 아이폰에서 사용하는건 굉장히 까다로운 것도 있지만 배터리 등 모바일 기기의 효율성 측면을 고려하지 않는다는 문제가 있습니다.
이때 애플은 ONNX에 기반한 CoreML 자체 프레임워크를 내세워서 '이거 쓰면 우리가 알아서 기기 상태에 따라 전기량이나 성능이나 그런거 조절해줄게'라고 하는 접근법을 사용합니다.
근데 문제는 이렇게 해서 접근 난도가 꽤나 높았다는 거구요(...)
그러던 중에 자연어처리 연구 분야가 Hugging Face 하나로 천하통일이 됩니다.
그리고 나서는 Exporters( https://github.com/huggingface/exporters )라는 형태로, Hugging Face Transformers라는 라이브러리에 기반한 모델 중 일부 모델을 Core ML로 손쉽게 변환해주는 킷이 나오게 됩니다.

사실 이 Exporters 이전에도 Core ML Tools( https://apple.github.io/coremltools/docs-guides/ ) 라는 Apple의 공식 변환 툴이 있었지만, 모델의 아키텍처를 하나하나 만들어줘야한다는 치명적인 단점이 있었습니다. -> 그래서 아무도 안썼어요...

아무튼 exporters를 사용하면 아래와 같은 명령어 한 줄로 (물론 지원하는 모델 한정) PyTorch/Transformers 모델을 Core ML 모델로 변환할 수 있습니다. (진짜, 짱 편해졌어요.)

그러면 이 Core ML로 변환하면 무엇이 나오냐 하면...
아래와 같이 `.mlpackage` 파일이 탄생합니다.

Apple은 Core ML 배포를 구버전의 mlmodel 이라는 방법과 신규 버전의 mlpackage라는 두 방식을 사용하는데요.
현재로는 대부분 mlpackage를 사용하길 권장하지만, 일부 모델의 경우 mlmodel로 컨버팅해야만 정상 동작하는 경우가 있습니다.
저는 현재 제가 직접 Pretrain한 BERT 모델을 기반으로 분류기를 만들고 있기 때문에 mlpackage를 통해 컨버팅해서 사용하고 있습니다.
이렇게 학습한 모델을 Core ML의 mlpackage로 변환해 XCode에 넣어주면 아래와 같이 ML Program으로 인식하고, 앱 개발 Swift 코드에서 불러와 사용할 수 있습니다.

이렇게 모델을 가져오면 성능 테스트도 해볼 수 있는데요.
간단히 제가 쓰는 iPhone 15 Pro 기준에서 ALL, 즉 CPU + GPU + Neural Engine 모드와 CPU Only모드를 비교해보면...

모두를 사용할 경우 일부 연산은 GPU, 그리고 나머지는 NE에서 이루어지는 것을 볼 수 있습니다.
예측 한번에 겨우 1ms 내로 처리되고, 로딩 시간을 포함해도 겨우 34ms 이내로 이뤄지는 것을 볼 수 있죠!(엄청 빠르죠?)
한편 CPU만 사용하는 경우는 한 2배~3배 정도로 느려집니다. 합쳐서 약 ~100ms로 이뤄지는데, 사실 이것도 여전히 충분히 빠른 속도라고 생각해요.

이렇게 모델이 정상적으로 동작하는걸 테스트하고나면...
앱에 태워야겠죠!
그리고 해당 AI 모델을 앱 내부에 탑재했구요!
그래서 아래와 같이 온라인 AI모드, 그리고 온디바이스 AI모드가 추가되었습니다 :)
앱스토어에 단순 스샷이 올라가있었는데, 이번에 조금 꾸며봤습니다. 괜찮아보이나요? ;)
가장 똑똑한 AI 모드인 온라인 AI 모드,
그리고 내 휴대폰 안에서만 동작하는 온디바이스 AI 모드가 추가되었습니다! (짝짝짝)
다만 대부분의 사용자들의 경우 온라인 AI를 사용하는게 좀 더 좋은 성능을 보여주며 동시에 새로운 기출변형 유형에도 실시간으로 대응이 가능하기 때문에,
정말 꼭 필요하신 분들(회사 업무 장비라거나 등등..)를 위한 서비스라고 생각해주세요 :)
모쪼록 많은 분들이 좋은 반응 보여주고 계셔서 기쁜 마음입니다.
아마 다음 업데이트는 사용자 문자 리포트 기능(스팸문자 리포트)가 들어갈 것 같아요.
써주시는 모든 분들 감사합니다!
여러분의 후기 하나하나가 개발 동기가 됩니다 :)
커스텀 모델 정확도는 대략 어느 정도인가요?
다만 맥 앱 개발시에는 coreML보다는 mlx가 좀더 편할것 같긴 합니다 ㅎㅎ
그리고 지금 iOS에 탑재된 버전의 경우는 제 데이터 test set 기준 90-93%정도 정확도를 보이고 있습니다.
또, 모델의 확신 수준이 ‘스팸이다!’가 90 이상이어야 분류하도록 해둔 상태입니다. (오탐방지)
당연히 온라인 AI는 그것보다 훨 좋구요 ㅎㅎ
다만 가장 큰 차이는 신규 패턴 대응이 얼마나 유연하냐의 차이가 커요.
매번 스팸이 조금씩 다르게 오는데, 오프라인 모델은 아무래도 업데이트를 해줘야만 대응이 가능하니까요 😅
온라인 모델은 큰 BERT + 생성형 폴백이 같이 있어서 준 실시간급 대응이 되는 상태라, 일반 사용자용으로는 온라인 모드가 낫습니다 ㅎㅎ
그런데 mlx가 macos용이라는건 어떤 의미에서 하신 말씀일까요? 아이폰으로도 돌아가지 않나요?
맥OS에서야 파워가 충분하니 괜찮지만요 ㅎㅎ
(그리고 거기에 답을하니 동일번호 두개가 문자가 따로생겨났습니다 -기본하나, 정크로의심됨하나-)
문자리포트기능을 기대해보겠습니다.
그리고 통신모드든 일반모드든 배터리 사용은 정말 미미하기 때문에 (하루에 1% 배터리도 안먹습니다 ㅎㅎ) 차이를 말하기 어려울 것 같습니다만, ‘이론상’ 온라인 모드가 덜 먹을 것 같긴 합니다 (연산을 덜 하니까요)
단점은..(어플 단점이 아니라 애플 단점)
아이폰에선 스팸으로 안보이는 문자가..
아이패드에선 그대로 보이네요 ㅠ
아이패드 설정의 메세지 필터링 옵션을 보면....활성화/비활성화 여부만 선택가능하고..
활성화 해놓으면 메세지앱에서 발신자에 따른 필터링만 가능합니다.
아무래도 아이폰과는 좀 상황이 좀 다른듯 하네요
참고로 아이패드에는 앱 설치를 하지 않은 상태입니다.
https://developer.apple.com/documentation/sms_and_call_reporting/ilmessagefilterqueryrequest
현재 후후 대신 이 앱을 SMS 필터링으로 선택하다보니 궁금하네요
https://www.clien.net/service/board/park/18735462?c=true#147986613CLIEN
https://www.clien.net/service/board/park/18739320CLIEN
질문 하나 있는데요 필터링 된 문자는 따로 보관되나요? 아니면 삭제되나요? 나중에 필터된 문자 중 스팸이 아닌게 혹 있을까 확인한번 해보려구요
오 확인했습니다 감사합니다
양질의 글 감사합니다. 앱 설치후 쓰고 있는데 궁금한게 있습니다.
화이트 리스트 번호는 앞 자리만 넣어도 되나요?
예를 들어 1588로 걸려오는 모든 번호는 허용하고 싶거든요
화이트리스트 넘버 룰에 대한 요청이 꾸준히 있는것 같아서 추가할 계획에 있습니다!
기본 후후로 잡혀 있었는데 얼마나 차이가 있을지 궁금하네요
/Vollago
(현재 Testflight는 1.1, 앱스토어는 1.2입니다)
테스트유저분들에게도 새 버전 릴리즈를 같이 진행할게요. 감사합니다 :)
스패맘에 간 메일들이 아이폰에는 알람 안뜨는데 워치에는 여전히 뜨던데요 혹시 워치에도 안뜨게 설정하는 방법이 있을까요??
/Vollago
혹시 셀룰러 버전을 사용중이신가요?
ps/ 스팸 문자가 아니라 스팸 ‘메일’.. 을 말씀하시는걸까요?
/Vollago
/Vollago
지금 가설이
- 만약 워치 GPS버전을 쓰면: 아이폰으로 문자 도착 --> 스마트스팸필터동작 --> 스팸이면 정크로, 따라서 알림 X
- 워치 셀룰러를 쓰면: 아이폰으로 문자 도착 & 셀룰러로도 문자 도착 --> 휴대폰은 필터동작 but 애플워치는 동작 X..?
이런 느낌인것 같은데요.
이게 문자가 아이폰을 거쳐서 온다고 생각했는데 셀룰러는 그 경로를 타는게 아닌것 같아서, 만약 곧바로 워치로 간다면 앱이 할 수 있는게 없어보이는데요...
지금 제 애플워치를 살펴보니 '정크'항목은 없고 <알 수 없는 발신자> 항목밖에 없네요 😅
대신 '읽지 않은 메시지'항목은 텅 비어있어요.
셀룰러 버전이 뭔가 분명 다르게 동작하는것 같은데...
혹시 셀룰러는 아이폰 본체가 꺼져있어도 문자가오나요?
아이폰 켜니까 다시 들어오고요
/Vollago
/Vollago
질문이 하나 남깁니다
SMART SPAM FILTER이(가) 필터링함 밑에
"거래" 와 "광고" 가 있는데
실제 걸러진건 다 정크 에 있더라구요
거래와 광고는 안걸러지나요?
지금은 스팸==광고==정크 로 보고있어요.
그리고 위 두개는 일반 분류라서 아이폰 노티 알림이 뜨기때문에.. 쓰는게 어떤 이점이 있는지 고민중에 있습니다 :)
둘 다 끄는게 필요하신걸까요??
나는 다음 달에 한국에 도착하는데 당신의 연락처가 없으니 내 라인 아이디를 추가해 주세요:ariel123123
혹시 며칠 몇시쯤 온건지 확인해주실수 있으실까요? (디버깅에 도움이 됩니다!)
현재 의심가는 것 몇 가지는...
무중단 롤링으로 서버 배포를 해두긴 했는데, 가끔 request 한두개를 놓치는 경우가 있더라구요. 이때 놓친건가..싶어보이는 경우,
그리고 서버에 지금 Request가 한번에 쏠리는 경우 iOS timeout을 넘어 응답하는경우, 정도일것 같아요.
어느쪽이든 체크해보겠습니다!
다만 맥과 연동되어 있으니 맥에는 해당 알림이 오는 것 (위의 아이패드 케이스 처럼 설정하는게 없더군요)과
애플워치로는 알림이 오는데 애플워치는 아이폰에서 받는것일텐데 이게 스팸이 걸러지기 전에 먼저 푸시를 받는 건지..
정작 아이폰에서는 정크로 걸러져 있는데 애플워치에서는 일반 메시지로 오게 되는게 개선되면 좋을 것 같습니다!
셀룰러같은 경우는 이게 아이폰에서 필터링 거치기 전에 애플워치가 동시 수신을 해버리는 것처럼 보여요.
애플워치 메시지 앱 설정에 정크 기능도 없구요...
macOS같은 경우도 몇년째(스팸정크 iOS는 iOS11부터 들어왔어요) 그대로이고 알 수 없는 필터링을 켜고 + iCloud 동기화를 켜면 알림까지는 안가는 것 같은데 iOS/iPadOS의 '정크' 기능 자체가 없는 듯 합니다.
이건 OS업데이트가 되어야 이뤄지는 부분이구...
만약 알림이 떠도 된다면, macOS에서는 sudo 권한을 받아서 스팸 걸러주는 macOS 전용 앱을 만들어 배포하게 될 것 같습니다. (메시지 앱의 DB 자체를 조작하는거죠)
--> 이거는 저도 불편한 부분이라서, iOS와 동기화는 아니고 별도로 스팸만 자동 삭제.?하는 방향으로 구현될 것 같습니다.
다만 문제가, 이런 방식으로 구현하면 사용자는 시스템 메시지 앱 내에서는 스팸문자를 볼 수 있는 방법이 없어져서, 이 부분이 조금 고민입니다. (아마 제 앱 안에 UI가 별도로 있어야겠죠..?)
오늘 설치해서 아직 제품의 효과는 모르겠으나, 사용하신 분들의 글을 읽어보니 좋을 거 같네요.
기대됩니다.
한번 사용해 보겠습니다