llama.cppの公式Swift Packageの使い方を調べたメモ - llama.swiftuiのコードリーディング
llama.cppにはiOS/macOS/visionOSに組み込みやすいようにSwift Packageが用意されている。
・・・ということについてトップのREADMEには何も書いてないのだが、Package.swiftが存在することからそれがわかる。
で、このSwift Packageの使い方についてのドキュメントがまったくない。後述するが、このSwift PackageにはほぼC/C++のコードしかなく(llama".cpp"なんて名前なのだからそれはそうとも言えるが)、Swiftからどう扱ってよいかパッとわかるようなつくりにもなっていない。
・・・というわけでリポジトリ内に同梱されているサンプル「llama.swiftui」を読んで実装方法を理解するしかない。
このコードリーディングを踏まえてどう実装したかはこちらのOSSを参照:
Package.swiftを見てみる
サンプルを読む前に、まずはどういうパッケージなのか、Package.swiftを見てみる。
利用するソースファイル
llama.cppリポジトリには大量のソースコードがあるわけだが、targetに渡しているところだけを抜粋してみると、実際に利用しているのはこれだけ:
...
var sources = [
"ggml.c",
"sgemm.cpp",
"llama.cpp",
"unicode.cpp",
"unicode-data.cpp",
"ggml-alloc.c",
"ggml-backend.c",
"ggml-quants.c",
]
var resources: [Resource] = []
...
#if canImport(Darwin)
sources.append("ggml-metal.m")
resources.append(.process("ggml-metal.metal"))
...
#endif
let package = Package(
...,
targets: [
.target(
...,
sources: sources,
resources: resources,
...
)
],
...
)
ごく一部のc, cppコードと、Darwin(iOSやmacOS)の場合にMetalの実装(.m, .metal)を利用している。
パッケージには一切Swiftラッパーのようなコードは含まれていないことがわかる。
公式サンプル「llama.swiftui」のコードを読む
最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/