見出し画像

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」のコードを読む

ここから先は

5,401字 / 3画像
文章やサンプルコードは多少荒削りかもしれませんが、ブログや書籍にはまだ書いていないことを日々大量に載せています。たったの400円で、すぐに購読解除してもその月は過去記事もさかのぼって読めるので、少しでも気になる内容がある方にはオトクかと思います。

技術的なメモやサンプルコード、思いついたアイデア、考えたこと、お金の話等々、頭をよぎった諸々を気軽に垂れ流しています。

最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/