Large Language Model Phi-3 und ML.NET

Aktuell über (oder unter)-bieten sich die LLM Anbieter. Jeden Tag ein neues Model. Das schöne daran ist, das diese zu einem Großteil direkt und kostenfrei nutzbar sind. Mein Forschungsschwerpunkt ist AI auf lokaler Hardware. So trifft es sich gut das Microsoft mit Phi-3 ein tiny Large Model liefert. Die kleine Variante hat nur 2GB und erstaunlich viel Wissen an Bord. So was klappt nur wenn man sehr viel Aufwand in die Trainingsdaten steckt,
Da es sehr viele ML Modell gibt, versucht man die Schnittstellen irgendwie zu standardisieren. Microsoft ist hier federführend bei ONNX und liefert Phi-3 auch in diesem Format.

phi-30

Ein Download der kleinsten Variante eines Large Models mit rund 2GB gelingt dann von Huggingface Hub, dem Tummelplatz für Datensätze, Modell und Webtools

git clone https://huggingface.co/microsoft/Phi-3-mini-4k-instruct-onnx

Während der Download läuft, kann man auf der Website per Webchat das Modell mal testen. Entweder man wählt aus den Prompt Examples aus oder fordert mit einer nicht ganz einfach zu lösenden Aufgaben in Deutsch.

phi-3

Klappt.

Nun möchte ich das LLM in einer .NET Anwendung verwenden. In ASP.NET Core 8 kommt dabei ML.NET zum Einsatz. In UWP Windows.ML. Je nach Architektur kann man dann Provider wählen für CUDA, nur CPU oder GPU, wenn auch Windows mit DirectML um über GDI die GPU zu nutzen.

Für erste starten wir mit einer Consolen Anwendung und installieren ein Nuget Paket

phi3-a

Es reicht Microsoft.ML.OnnxRuntimeGenAI. In den Dokus stehen teilweise bis zu drei benötigte Pakete. Den folgenden Code habe ich aus dem ML.NET Beispiel für Phi-2 adaptiert.

Diese Bibliothek kapselt ML.NET und ONNX in einem. Ich habe für visuelle Erkennung ähnliches direkt auf ML.NET implementiert. Das braucht ein vielfaches an Code um Daten, Pipeline, Training und Nutzung in C# zu realisieren. Das hier ist wunderwuzzi voodoo.

   1:  using Microsoft.ML.OnnxRuntimeGenAI;
   2:  //https://github.com/microsoft/onnxruntime-genai/blob/main/examples/csharp/HelloPhi2/Program.cs
   3:  Console.WriteLine("Phi-3");
   4:  Console.WriteLine("-----");
   5:   
   6:  string modelPath = "C:\\stateof\\Phi-3-mini-4k-instruct-onnx\\cpu_and_mobile\\cpu-int4-rtn-block-32-acc-level-4";
   7:  //' JSON Error: Unknown value: eos_token_id at line 29 index 27" -löschen
   8:  //Unsupported model_type in config.json: phi3"   "type": "phi",
 
  13:  using Model model = new Model(modelPath);
  14:  using Tokenizer tokenizer = new Tokenizer(model);
  15:   
  16:  while (true)
  17:  {
  18:      Console.WriteLine("Prompt:");
  19:      string prompt = Console.ReadLine() ?? string.Empty;
  20:      var sequences = tokenizer.Encode(prompt);
  21:   
  22:      using GeneratorParams generatorParams = new GeneratorParams(model);
  23:      generatorParams.SetSearchOption("max_length", 400); // Maximum length of the output
  24:      generatorParams.SetSearchOption("temperature", 0.3); //  0 means deterministic, near 1 means more random
  25:      generatorParams.SetInputSequences(sequences);
  26:      using var tokenizerStream = tokenizer.CreateStream();
  27:      using var generator = new Generator(model, generatorParams);
  28:      while (!generator.IsDone())
  29:      {
  30:          generator.ComputeLogits();
  31:          generator.GenerateNextToken();
  32:          Console.Write(tokenizerStream.Decode(generator.GetSequence(0)[^1]));
  33:          if (Console.KeyAvailable)
  34:          {
  35:              if (Console.ReadKey().Key == ConsoleKey.Escape)
  36:              {
  37:                  Console.WriteLine(" Abbruch");
  38:                  break;
  39:              }
  40:          }
  41:      }
  42:   
  43:  }

 

Die Anwendung hat zwei Probleme in der config.json, die in den Kommentaren Zeile 7-8 beschrieben sind. Ich habe dein Eintrag gelöscht und den anderen einfach auf Phi gesetzt.
Auch mit den Parametern ist mehr raten als wissen angesagt. Das Starten der Anwendung dauert auf meinen Rechner 1 Minute. Vermutlich sind 2GB Modell zu laden auch von einer SSD etwas was dauert.

Das selbe Modell nun auf Basis von ML.NET zeigt sich als äußert geschwätzig und besserwisserisch.

phi3-b

Mit der Version 0.1 der ONNX Runtime ist das nicht passiert. Ist eben alles sehr preview.
Als nächstes der Versuch Direct.ML als Bibliothek zu nutzen. Dazu braucht es dann auch eine dafür spezialisiertes Model, was Microsoft auch anbietet. Allerdings hab ich das bisher nicht zum laufen gebracht.

Kommentare sind geschlossen