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

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

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

llama_cpp 是一个Dart绑定库,用于流行的LLM推理框架 llama.cpp,旨在将AI引入Dart世界。下面是如何在Flutter项目中使用这个插件的指南。

Overview

  • 在独立的Dart isolate中进行文本生成。
  • 以Dart风格的流式输出。
  • 集成 native_assets_cli
  • 使用极其简单。
  • 支持LLM和嵌入模型。

尝试示例

首先克隆仓库并设置环境:

git clone https://github.com/lindeer/llama-cpp.git
cd llama-cpp
git submodule init --recursive
dart pub get

然后运行以下命令之一来体验功能:

文本生成

dart --enable-experiment=native-assets run example/main.dart "/path/to/your/LLM.gguf" "your prompt"

启动HTTP服务器

dart --enable-experiment=native-assets run example/server.dart "/path/to/your/LLM.gguf"

使用嵌入模型

dart --enable-experiment=native-assets run example/embedding.dart "/path/to/your/embedding.gguf" "your text line1
your text line2"

此外,还有一个位于 example/rag/ 的最小RAG(Retrieval-Augmented Generation)示例,包含所有本地数据和模型,灵感来源于 privateGPT

设置步骤

  1. 设置Chroma服务器:

    pip install chromadb
    uvicorn chromadb.app:app --reload --workers 1 --host 0.0.0.0 --port 8000
    
  2. 配置本地模型:

    创建并编辑 config.json 文件:

    {
      "gpt_model": "/your/local/gpt/model",
      "embedding_model": "/your/local/embedding/model"
    }
    
  3. 保存文档到向量数据库:

    dart --enable-experiment=native-assets run bin/ingest.dart
    
  4. 与GPT聊天:

    dart --enable-experiment=native-assets run bin/rag.dart
    

入门指南

下面是一个简单的例子,展示如何让LLM以打字效果回答问题:

import 'package:llama_cpp/llama_cpp.dart';
import 'dart:io';

void main() async {
  final path = '/path/to/your/LLM.gguf';
  final prompt = 'Hello my name is';
  final llama = await LlamaCpp.load(path, verbose: true);

  await for (final text in llama.answer(prompt)) {
    stdout.write(text);
  }
  stdout.writeln();

  await llama.dispose();
}

或者如果你想要完整的答案:

final answer = await llama.answer(prompt).join('');

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

1 回复

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


在Flutter中,如果你需要执行高性能计算任务,通常会面临一些挑战,因为Dart(Flutter的主要编程语言)并非为高性能计算而设计。然而,通过使用原生代码扩展(如C++),你可以显著提升性能。llama_cpp这样的插件允许你在Flutter应用中调用C++代码进行高性能计算。

下面是一个基本的示例,展示如何在Flutter项目中集成并使用一个假设的llama_cpp插件。请注意,llama_cpp并非一个实际存在的广泛认知的插件,但此示例将遵循一般的原生插件集成流程。

1. 创建Flutter插件项目

首先,确保你已经安装了Flutter SDK,并创建了一个新的Flutter项目。

flutter create high_performance_app
cd high_performance_app

2. 创建Flutter插件

在Flutter项目的根目录下,添加一个新的插件目录(假设为llama_cpp)。

mkdir packages/llama_cpp
cd packages/llama_cpp
flutter create --org com.example --template=plugin .

3. 实现C++代码

在插件项目的iosandroid目录下分别实现C++代码。

iOS (Objective-C++)

ios/Classes/LlamaCppPlugin.mm中:

#import "LlamaCppPlugin.h"
#include "llama_cpp_implementation.hpp" // 假设这是你的C++实现文件

@implementation LlamaCppPlugin
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
    auto channel = FlutterMethodChannel::create(
        registrar->messenger(),
        @"com.example.llama_cpp/channel",
        &flutter::MethodChannel::StandardMethodCallCodec::GetInstance()
    );

    std::unique_ptr<LlamaCppDelegate> delegate(new LlamaCppDelegate());
    channel->setMethodCallHandler(
        [delegate](const FlutterMethodCall* call, FlutterResult result) {
            if ([@"performHighPerformanceCalculation" isEqualToString:call.method]) {
                // 假设performCalculation是LlamaCppDelegate中的一个方法
                auto resultValue = delegate->performCalculation();
                result(FlutterResultValue::from(resultValue));
            } else {
                result(FlutterMethodNotImplemented);
            }
        }
    );
}
@end

ios/Classes/llama_cpp_implementation.hpp中:

#ifndef llama_cpp_implementation_hpp
#define llama_cpp_implementation_hpp

#include <string>

class LlamaCppDelegate {
public:
    int performCalculation();
};

#endif /* llama_cpp_implementation_hpp */

ios/Classes/llama_cpp_implementation.cpp中:

#include "llama_cpp_implementation.hpp"

int LlamaCppDelegate::performCalculation() {
    // 高性能计算代码
    return 42; // 示例返回值
}

Android (JNI)

android/src/main/cpp/native-lib.cpp中:

#include <jni.h>
#include <string>

extern "C" JNIEXPORT jint JNICALL
Java_com_example_llama_cpp_LlamaCppPlugin_performCalculation(JNIEnv* env, jobject /* this */) {
    // 高性能计算代码
    return 42; // 示例返回值
}

android/src/main/java/com/example/llama_cpp/LlamaCppPlugin.java中:

package com.example.llama_cpp;

import androidx.annotation.NonNull;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.embedding.engine.plugins.activity.ActivityAware;
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
import io.flutter.plugin.common.BinaryMessenger;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.platform.PlatformViewRegistry;

public class LlamaCppPlugin implements FlutterPlugin, ActivityAware {
    private MethodChannel channel;

    @Override
    public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
        BinaryMessenger messenger = flutterPluginBinding.getBinaryMessenger();
        channel = new MethodChannel(messenger, "com.example.llama_cpp/channel");
        channel.setMethodCallHandler(
                (call, result) -> {
                    if (call.method.equals("performHighPerformanceCalculation")) {
                        int resultValue = performCalculation();
                        result.success(resultValue);
                    } else {
                        result.notImplemented();
                    }
                });
    }

    private native int performCalculation();

    static {
        System.loadLibrary("native-lib");
    }

    @Override
    public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
        channel.setMethodCallHandler(null);
    }

    @Override
    public void onAttachedToActivity(ActivityPluginBinding binding) {
        // No-op
    }

    @Override
    public void onDetachedFromActivityForConfigChanges() {
        // No-op
    }

    @Override
    public void onReattachedToActivityForConfigChanges(ActivityPluginBinding binding) {
        // No-op
    }

    @Override
    public void onDetachedFromActivity() {
        // No-op
    }
}

4. 在Flutter应用中使用插件

回到你的Flutter应用项目目录,在pubspec.yaml中添加对llama_cpp插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  llama_cpp:
    path: ../packages/llama_cpp

然后在你的Dart代码中调用插件方法:

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _result = 'Unknown';

  Future<void> _performCalculation() async {
    final result = await LlamaCpp.performHighPerformanceCalculation();
    setState(() {
      _result = 'Result: $result';
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('High Performance Calculation'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(_result),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: _performCalculation,
                child: Text('Perform Calculation'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

5. 构建和运行

确保你已经正确设置了开发环境,然后运行Flutter应用:

flutter pub get
cd ..
flutter run

这个示例展示了如何在Flutter中集成一个使用C++进行高性能计算的插件。请根据你的实际需求调整C++代码和Flutter插件的实现。

回到顶部