Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Flutterでllama.cppをつかってローカルLLMを試してみた
Search
sakuraidayo
April 26, 2025
Programming
500
0
Share
Flutterでllama.cppをつかってローカルLLMを試してみた
sakuraidayo
April 26, 2025
Other Decks in Programming
See All in Programming
メッセージングを利用して時間的結合を分離しよう #phperkaigi
kajitack
3
570
의존성 주입과 모듈화
fornewid
0
120
見せてもらおうか、 OpenSearchの性能とやらを!
shunta27
1
180
へんな働き方
yusukebe
6
2.9k
Redox OS でのネームスペース管理と chroot の実現
isanethen
0
560
Kubernetes上でAgentを動かすための最新動向と押さえるべき概念まとめ
sotamaki0421
3
450
PDI: Como Alavancar Sua Carreira e Seu Negócio
marcelgsantos
0
110
Rethinking API Platform Filters
vinceamstoutz
0
11k
LM Linkで(非力な!)ノートPCでローカルLLM
seosoft
0
420
年間50登壇、単著出版、雑誌寄稿、Podcast出演、YouTube、CM、カンファレンス主催……全部やってみたので面白さ等を比較してみよう / I’ve tried them all, so let’s compare how interesting they are.
nrslib
4
740
車輪の再発明をしよう!PHP で実装して学ぶ、Web サーバーの仕組みと HTTP の正体
h1r0
3
510
今からFlash開発できるわけないじゃん、ムリムリ! (※ムリじゃなかった!?)
arkw
0
190
Featured
See All Featured
Design in an AI World
tapps
0
190
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Un-Boring Meetings
codingconduct
0
260
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.8k
Writing Fast Ruby
sferik
630
63k
Between Models and Reality
mayunak
3
260
The Spectacular Lies of Maps
axbom
PRO
1
680
The Curious Case for Waylosing
cassininazir
0
290
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
370
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
3.8k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
1k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.4k
Transcript
Flutter でローカルLLM 1
自己紹介 名前:sakurai 株式会社SHIFT 所属 DAAE グループのエンジニア Flutter を使ったモバイルアプリ開発をしています Flutter でローカルLLM
2
前置き 2025 年初頭、DeepSeek 登場から、蒸留モデルが話題に これってモバイル端末でも動くのでは? Flutter でローカルLLM をやってみたい。 Flutter でローカルLLM
3
ローカルLLM の選択 まずローカルLLM ってどうやる? 「llama.cpp 」が最適な選択肢 GPU がない低スペック環境でも動作可能 クロスプラットフォーム対応 Android
やiOS での実装サンプルもあり動きそう Flutter でローカルLLM 4
Flutter との連携 pub.dev の既存パッケージを検証 llama_cpp_dart(https://pub.dev/packages/llama_cpp_dart) fllama(https://pub.dev/packages/fllama) 残念ながら思うように動作せず... Flutter でローカルLLM 5
開発アプローチ llama.cpp のソースコードとexample を参考に実装 今回はAndroid のみで検証 Flutter でローカルLLM 6
実装ステップ Flutter でローカルLLM 7
実装ステップ① - プロジェクト作成 % flutter create --org com.example.sakurai --platforms=android,ios -a
kotlin local_llm_sample . └── android └── app └── src └── main └── cpp ├── CMakeLists.txt ← 追加 └── llama_bridge.cpp ← 追加 Flutter でローカルLLM 8
実装ステップ② - CMakeLists.txt cmake_minimum_required(VERSION 3.22.1) project("llama-flutter") include(FetchContent) FetchContent_Declare( llama GIT_REPOSITORY
https://github.com/ggerganov/llama.cpp GIT_TAG master ) FetchContent_MakeAvailable(llama) add_library(llama_bridge SHARED llama_bridge.cpp) target_link_libraries(llama_bridge llama common android log) Flutter でローカルLLM 9
実装ステップ② - llama_bridge.cpp // llama.cppのラッパー関数 extern "C" { int64_t load_model(const
char* filename) { // モデルのロード処理 } int64_t new_context(int64_t model_ptr) { // コンテキスト作成 } // 推論関数(簡略化) const char* completion_loop(int64_t ctx_ptr, int64_t batch_ptr, int64_t sampler_ptr, int32_t len, int32_t cur) { // 推論処理 } } Flutter でローカルLLM 10
実装ステップ② - build.gradle の設定 android { defaultConfig { externalNativeBuild {
cmake { arguments.addAll(["-DLLAMA_BUILD_COMMON=ON", "-DGGML_LLAMAFILE=OFF", "-DCMAKE_BUILD_TYPE=Release"]) } } } externalNativeBuild { cmake { path "src/main/cpp/CMakeLists.txt" } } } Flutter でローカルLLM 11
実装ステップ③ - Flutter 側の実装 必要なパッケージを追加: dependencies: flutter_localizations: sdk: flutter ffi:
^2.1.3 Flutter でローカルLLM 12
実装ステップ③ - llama_bridge.dart import 'dart:ffi'; import "package:ffi/ffi.dart"; class LlamaFFI {
// ネイティブライブラリをロード static final DynamicLibrary _lib = DynamicLibrary.open("libllama_bridge.so"); // C++の関数とDartの関数をマッピング static final _loadModel = _lib.lookupFunction< Int64 Function(Pointer<Utf8>), int Function(Pointer<Utf8>) >('load_model'); // Dartから呼び出せるラッパーメソッド static int loadModel(String path) { final pathPtr = path.toNativeUtf8(); try { return _loadModel(pathPtr); } finally { calloc.free(pathPtr); } } } Flutter でローカルLLM 13
実装ステップ④ - アプリのUI 実装 - チャットインターフェースの実装 - モデルのダウンロード、ロードの機能 - Deepseekの蒸留モデルを検討していたが、
検証中に登場したTinySwallowに変更 Flutter でローカルLLM 14
デモ Flutter でローカルLLM 15
課題と成果 課題 高度なパラメータ調整にはllama.cpp の詳細理解が必要 成果 Flutter でローカルLLM (SLM? )を実行できた! dart:ffi
で既存のC++ の資産を利用できるようになった! Flutter でローカルLLM 16
技術ブログ https://note.shiftinc.jp/n/nd22d56bb52ec Flutter でローカルLLM 17
おわり 18