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
0
300
Flutterでllama.cppをつかってローカルLLMを試してみた
sakuraidayo
April 26, 2025
Tweet
Share
Other Decks in Programming
See All in Programming
ポスターセッション: 「まっすぐ行って、右!」って言ってラズパイカーを動かしたい 〜生成AI × Raspberry Pi Pico × Gradioの試作メモ〜
komofr
0
440
Model Pollution
hschwentner
1
170
議事録の要点整理を自動化! サーバレス Bot 構築術
penpeen
3
1.5k
Swiftビルド弾丸ツアー - Swift Buildが作る新しいエコシステム
giginet
PRO
0
1.3k
Android 16 × Jetpack Composeで縦書きテキストエディタを作ろう / Vertical Text Editor with Compose on Android 16
cc4966
2
1.1k
どの様にAIエージェントと 協業すべきだったのか?
takefumiyoshii
0
130
Serena MCPのすすめ
wadakatu
3
230
CSC509 Lecture 02
javiergs
PRO
0
370
Django Ninja による API 開発効率化とリプレースの実践
kashewnuts
0
390
Web技術を最大限活用してRAW画像を現像する / Developing RAW Images on the Web
ssssota
2
640
2025年版 サーバーレス Web アプリケーションの作り方
hayatow
22
24k
WebエンジニアがSwiftをブラウザで動かすプレイグラウンドを作ってみた
ohmori_yusuke
0
160
Featured
See All Featured
GraphQLの誤解/rethinking-graphql
sonatard
72
11k
Docker and Python
trallard
46
3.6k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
657
61k
Building Better People: How to give real-time feedback that sticks.
wjessup
368
20k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
114
20k
Large-scale JavaScript Application Architecture
addyosmani
513
110k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
140
34k
Six Lessons from altMBA
skipperchong
28
4k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.7k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
6k
The Cost Of JavaScript in 2023
addyosmani
53
8.9k
VelocityConf: Rendering Performance Case Studies
addyosmani
332
24k
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