Flutter高性能计算插件llama_cpp_dart的使用

发布于 1周前 作者 itying888 来自 Flutter

Flutter高性能计算插件llama_cpp_dart的使用

llama_cpp_dart 是一个高性能的Dart绑定库,用于集成llama.cpp,使Dart和Flutter应用程序能够实现先进的文本生成功能,并提供了灵活的集成选项。

概述

该库为将llama.cpp集成到你的Dart/Flutter项目中提供了三个层次的抽象,让你可以根据需要在控制力和便利性之间找到合适的平衡:

  1. 低级FFI绑定:直接访问llama.cpp函数
  2. 高级封装:简化、面向对象的API
  3. 管理隔离:适合Flutter应用的非阻塞实现

特点

  • 使用Dart隔离区进行异步文本生成
  • 通过可定制参数提供灵活配置
  • 支持多种集成方式以适应不同需求
  • 实时文本生成,基于流输出
  • 支持不同的提示格式(ChatML, Alpaca)
  • 对模型、上下文和采样的全面参数控制

使用示例

低级FFI绑定

直接与llama.cpp集成,具有最大控制权:

import 'package:llama_cpp_dart/src/llama_cpp.dart';

void main() {
  final lib = llama_cpp(DynamicLibrary.open("libllama.dylib"));
  // 初始化模型、上下文和采样参数
  // 参见examples/low_level.dart获取完整示例
}

高级封装

简化API,适用于常见用例:

import 'package:llama_cpp_dart/llama_cpp_dart.dart';

void main() {
  Llama.libraryPath = "libllama.dylib";
  final llama = Llama("path/to/model.gguf");
  
  llama.setPrompt("2 * 2 = ?");
  while (true) {
    var (token, done) = llama.getNext();
    print(token);
    if (done) break;
  }
  llama.dispose();
}

管理隔离

非常适合Flutter应用:

import 'package:llama_cpp_dart/llama_cpp_dart.dart';

void main() async {
  final loadCommand = LlamaLoad(
    path: "path/to/model.gguf",
    modelParams: ModelParams(),
    contextParams: ContextParams(),
    samplingParams: SamplerParams(),
    format: ChatMLFormat(),
  );

  final llamaParent = LlamaParent(loadCommand);
  await llamaParent.init();

  llamaParent.stream.listen((response) => print(response));
  llamaParent.sendPrompt("2 * 2 = ?");
}

开始使用

前置条件

  • Dart SDK(适用于控制台应用)
  • Flutter SDK(适用于Flutter应用)
  • 编译好的llama.cpp共享库

构建llama.cpp

  1. 克隆llama.cpp仓库:
    git clone https://github.com/ggerganov/llama.cpp
    
  2. 编译成共享库:
    • Windows: 输出.dll
    • Linux: 输出.so
    • macOS: 输出.dylib
  3. 将编译后的库放置在项目的可访问目录中

安装

在你的pubspec.yaml文件中添加依赖:

dependencies:
  llama_cpp_dart: ^latest_version

请确保替换^latest_version为实际的最新版本号。

许可证

该项目采用MIT许可证,请参阅LICENSE.md文件了解详细信息。


更多关于Flutter高性能计算插件llama_cpp_dart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter高性能计算插件llama_cpp_dart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用llama_cpp_dart插件进行高性能计算的示例代码。请注意,llama_cpp_dart可能是一个假想的插件名称,因为在实际Flutter生态系统中,可能没有直接名为llama_cpp_dart的插件。然而,我会基于一个假设的高性能计算插件的结构给出一个示例,这个插件使用C++进行底层计算,并通过Dart接口暴露给Flutter。

1. 设置Flutter项目

首先,确保你已经创建了一个Flutter项目。如果还没有,可以使用以下命令创建一个新的Flutter项目:

flutter create high_performance_compute_app
cd high_performance_compute_app

2. 创建C++高性能计算库

在你的Flutter项目根目录下,创建一个名为native_code的文件夹,并在其中创建C++代码。

native_code/CMakeLists.txt

cmake_minimum_required(VERSION 3.10)

project(high_performance_compute)

add_library(high_performance_compute SHARED
            high_performance_compute.cpp)

find_package(OpenMP REQUIRED)
target_compile_options(high_performance_compute PRIVATE ${OpenMP_CXX_FLAGS})
target_link_libraries(high_performance_compute PRIVATE ${OpenMP_CXX_LIBRARIES})

native_code/high_performance_compute.cpp

#include <omp.h>
#include <vector>
#include <jni.h>

extern "C" {
JNIEXPORT jint JNICALL
Java_com_example_highperformancecompute_NativeLib_compute(JNIEnv* env, jobject /* this */, jint numElements) {
    std::vector<double> data(numElements);
    #pragma omp parallel for
    for (int i = 0; i < numElements; ++i) {
        data[i] = i * i;  // 示例计算:平方
    }
    return 0;  // 返回值为0仅表示操作成功,实际应用中可能返回结果或状态码
}
}

3. 创建JNI接口

android文件夹下,创建JNI接口。

android/app/src/main/cpp/NativeLib.cpp

#include <jni.h>
#include "high_performance_compute.cpp"  // 包含我们的高性能计算库

extern "C" JNIEXPORT jint JNICALL
Java_com_example_highperformancecompute_NativeLib_compute(JNIEnv* env, jobject /* this */, jint numElements) {
    return compute(numElements);  // 调用我们的高性能计算函数
}

android/app/src/main/java/com/example/highperformancecompute/NativeLib.java

package com.example.highperformancecompute;

public class NativeLib {

    // 加载本地库
    static {
        System.loadLibrary("high_performance_compute");
    }

    // 声明本地方法
    public native int compute(int numElements);
}

4. Flutter Dart代码

使用MethodChannel与原生代码进行通信。

lib/main.dart

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  static const platform = MethodChannel('com.example.highperformancecompute/channel');

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('High Performance Compute'),
        ),
        body: Center(
          child: ComputeButton(),
        ),
      ),
    );
  }
}

class ComputeButton extends StatefulWidget {
  @override
  _ComputeButtonState createState() => _ComputeButtonState();
}

class _ComputeButtonState extends State<ComputeButton> {
  String _result = 'Compute...';

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: _compute,
      child: Text('Compute'),
    );
  }

  Future<void> _compute() async {
    try {
      final int result = await MyApp.platform.invokeMethod('compute', 1000000);  // 调用原生方法
      setState(() {
        _result = 'Computed $result elements';  // 更新UI(注意:这里的result仅为示例)
      });
    } on PlatformException catch (e) {
      setState(() {
        _result = 'Failed to compute: \'${e.message}\'.';
      });
    }
  }

  @override
  Widget buildResult(BuildContext context) {
    return Text(_result);
  }
}

5. 配置build.gradle

确保在android/app/build.gradle中配置了CMake和NDK。

android {
    ...
    defaultConfig {
        ...
        externalNativeBuild {
            cmake {
                cppFlags "-std=c++17"
            }
        }
    }
    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
        }
    }
    ...
}

6. 运行应用

确保所有配置正确后,使用以下命令运行Flutter应用:

flutter run

这个示例展示了如何在Flutter项目中集成一个使用C++进行高性能计算的本地库,并通过Dart代码调用它。请注意,实际项目中可能需要更多的配置和错误处理,这里仅提供了一个基本的框架。

回到顶部