You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

LLavaInteractiveModeExecute.md 5.5 kB

1 year ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. # LLaVA - basic
  2. ```cs
  3. using System.Text.RegularExpressions;
  4. using LLama.Common;
  5. using Spectre.Console;
  6. using LLama.Native;
  7. namespace LLama.Examples.Examples
  8. {
  9. // This example shows how to chat with LLaVA model with both image and text as input.
  10. // It uses the interactive executor to inference.
  11. public class LlavaInteractiveModeExecute
  12. {
  13. public static async Task Run()
  14. {
  15. string multiModalProj = UserSettings.GetMMProjPath();
  16. string modelPath = UserSettings.GetModelPath();
  17. string modelImage = UserSettings.GetImagePath();
  18. const int maxTokens = 1024;
  19. var prompt = $"{{{modelImage}}}\nUSER:\nProvide a full description of the image.\nASSISTANT:\n";
  20. var parameters = new ModelParams(modelPath);
  21. using var model = LLamaWeights.LoadFromFile(parameters);
  22. using var context = model.CreateContext(parameters);
  23. // Llava Init
  24. using var clipModel = LLavaWeights.LoadFromFile(multiModalProj);
  25. var ex = new InteractiveExecutor(context, clipModel );
  26. Console.ForegroundColor = ConsoleColor.Yellow;
  27. Console.WriteLine("The executor has been enabled. In this example, the prompt is printed, the maximum tokens is set to {0} and the context size is {1}.", maxTokens, parameters.ContextSize );
  28. Console.WriteLine("To send an image, enter its filename in curly braces, like this {c:/image.jpg}.");
  29. var inferenceParams = new InferenceParams() { Temperature = 0.1f, AntiPrompts = new List<string> { "\nUSER:" }, MaxTokens = maxTokens };
  30. do
  31. {
  32. // Evaluate if we have images
  33. //
  34. var imageMatches = Regex.Matches(prompt, "{([^}]*)}").Select(m => m.Value);
  35. var imageCount = imageMatches.Count();
  36. var hasImages = imageCount > 0;
  37. if (hasImages)
  38. {
  39. var imagePathsWithCurlyBraces = Regex.Matches(prompt, "{([^}]*)}").Select(m => m.Value);
  40. var imagePaths = Regex.Matches(prompt, "{([^}]*)}").Select(m => m.Groups[1].Value).ToList();
  41. List<byte[]> imageBytes;
  42. try
  43. {
  44. imageBytes = imagePaths.Select(File.ReadAllBytes).ToList();
  45. }
  46. catch (IOException exception)
  47. {
  48. Console.ForegroundColor = ConsoleColor.Red;
  49. Console.Write(
  50. $"Could not load your {(imageCount == 1 ? "image" : "images")}:");
  51. Console.Write($"{exception.Message}");
  52. Console.ForegroundColor = ConsoleColor.Yellow;
  53. Console.WriteLine("Please try again.");
  54. break;
  55. }
  56. // Each prompt with images we clear cache
  57. // When the prompt contains images we clear KV_CACHE to restart conversation
  58. // See:
  59. // https://github.com/ggerganov/llama.cpp/discussions/3620
  60. ex.Context.NativeHandle.KvCacheRemove( LLamaSeqId.Zero, -1, -1 );
  61. int index = 0;
  62. foreach (var path in imagePathsWithCurlyBraces)
  63. {
  64. // First image replace to tag <image, the rest of the images delete the tag
  65. prompt = prompt.Replace(path, index++ == 0 ? "<image>" : "");
  66. }
  67. Console.ForegroundColor = ConsoleColor.Yellow;
  68. Console.WriteLine($"Here are the images, that are sent to the chat model in addition to your message.");
  69. Console.WriteLine();
  70. foreach (var consoleImage in imageBytes?.Select(bytes => new CanvasImage(bytes)))
  71. {
  72. consoleImage.MaxWidth = 50;
  73. AnsiConsole.Write(consoleImage);
  74. }
  75. Console.WriteLine();
  76. Console.ForegroundColor = ConsoleColor.Yellow;
  77. Console.WriteLine($"The images were scaled down for the console only, the model gets full versions.");
  78. Console.WriteLine($"Write /exit or press Ctrl+c to return to main menu.");
  79. Console.WriteLine();
  80. // Initialize Images in executor
  81. //
  82. foreach (var image in imagePaths)
  83. {
  84. ex.Images.Add(await File.ReadAllBytesAsync(image));
  85. }
  86. }
  87. Console.ForegroundColor = Color.White;
  88. await foreach (var text in ex.InferAsync(prompt, inferenceParams))
  89. {
  90. Console.Write(text);
  91. }
  92. Console.Write(" ");
  93. Console.ForegroundColor = ConsoleColor.Green;
  94. prompt = Console.ReadLine();
  95. Console.WriteLine();
  96. // let the user finish with exit
  97. //
  98. if (prompt != null && prompt.Equals("/exit", StringComparison.OrdinalIgnoreCase))
  99. break;
  100. }
  101. while(true);
  102. }
  103. }
  104. }
  105. ```