| @@ -1,8 +1,6 @@ | |||||
| using System.Text.RegularExpressions; | using System.Text.RegularExpressions; | ||||
| using LLama.Batched; | |||||
| using LLama.Common; | using LLama.Common; | ||||
| using Spectre.Console; | using Spectre.Console; | ||||
| using LLama.Abstractions; | |||||
| using LLama.Native; | using LLama.Native; | ||||
| namespace LLama.Examples.Examples | namespace LLama.Examples.Examples | ||||
| @@ -20,9 +18,8 @@ namespace LLama.Examples.Examples | |||||
| var prompt = $"{{{modelImage}}}\nUSER:\nProvide a full description of the image.\nASSISTANT:\n"; | var prompt = $"{{{modelImage}}}\nUSER:\nProvide a full description of the image.\nASSISTANT:\n"; | ||||
| var parameters = new ModelParams(modelPath) | |||||
| { | |||||
| }; | |||||
| var parameters = new ModelParams(modelPath); | |||||
| using var model = LLamaWeights.LoadFromFile(parameters); | using var model = LLamaWeights.LoadFromFile(parameters); | ||||
| using var context = model.CreateContext(parameters); | using var context = model.CreateContext(parameters); | ||||
| @@ -45,16 +42,16 @@ namespace LLama.Examples.Examples | |||||
| var imageMatches = Regex.Matches(prompt, "{([^}]*)}").Select(m => m.Value); | var imageMatches = Regex.Matches(prompt, "{([^}]*)}").Select(m => m.Value); | ||||
| var imageCount = imageMatches.Count(); | var imageCount = imageMatches.Count(); | ||||
| var hasImages = imageCount > 0; | var hasImages = imageCount > 0; | ||||
| byte[][] imageBytes = null; | |||||
| if (hasImages) | if (hasImages) | ||||
| { | { | ||||
| var imagePathsWithCurlyBraces = Regex.Matches(prompt, "{([^}]*)}").Select(m => m.Value); | var imagePathsWithCurlyBraces = Regex.Matches(prompt, "{([^}]*)}").Select(m => m.Value); | ||||
| var imagePaths = Regex.Matches(prompt, "{([^}]*)}").Select(m => m.Groups[1].Value); | |||||
| var imagePaths = Regex.Matches(prompt, "{([^}]*)}").Select(m => m.Groups[1].Value).ToList(); | |||||
| List<byte[]> imageBytes; | |||||
| try | try | ||||
| { | { | ||||
| imageBytes = imagePaths.Select(File.ReadAllBytes).ToArray(); | |||||
| imageBytes = imagePaths.Select(File.ReadAllBytes).ToList(); | |||||
| } | } | ||||
| catch (IOException exception) | catch (IOException exception) | ||||
| { | { | ||||
| @@ -77,10 +74,7 @@ namespace LLama.Examples.Examples | |||||
| foreach (var path in imagePathsWithCurlyBraces) | foreach (var path in imagePathsWithCurlyBraces) | ||||
| { | { | ||||
| // First image replace to tag <image, the rest of the images delete the tag | // First image replace to tag <image, the rest of the images delete the tag | ||||
| if (index++ == 0) | |||||
| prompt = prompt.Replace(path, "<image>"); | |||||
| else | |||||
| prompt = prompt.Replace(path, ""); | |||||
| prompt = prompt.Replace(path, index++ == 0 ? "<image>" : ""); | |||||
| } | } | ||||
| @@ -105,7 +99,7 @@ namespace LLama.Examples.Examples | |||||
| // | // | ||||
| foreach (var image in imagePaths) | foreach (var image in imagePaths) | ||||
| { | { | ||||
| ex.Images.Add(File.ReadAllBytes(image)); | |||||
| ex.Images.Add(await File.ReadAllBytesAsync(image)); | |||||
| } | } | ||||
| } | } | ||||
| @@ -121,7 +115,7 @@ namespace LLama.Examples.Examples | |||||
| // let the user finish with exit | // let the user finish with exit | ||||
| // | // | ||||
| if (prompt.Equals("/exit", StringComparison.OrdinalIgnoreCase)) | |||||
| if (prompt != null && prompt.Equals("/exit", StringComparison.OrdinalIgnoreCase)) | |||||
| break; | break; | ||||
| } | } | ||||
| @@ -25,7 +25,7 @@ namespace LLama.Abstractions | |||||
| public LLavaWeights? ClipModel { get; } | public LLavaWeights? ClipModel { get; } | ||||
| /// <summary> | /// <summary> | ||||
| /// List of images: Image filen path, uri or image byte array. See ImageData. | |||||
| /// List of images: List of images in byte array format. | |||||
| /// </summary> | /// </summary> | ||||
| public List<byte[]> Images { get; } | public List<byte[]> Images { get; } | ||||
| @@ -79,7 +79,7 @@ namespace LLama | |||||
| public LLavaWeights? ClipModel { get; } | public LLavaWeights? ClipModel { get; } | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public List<byte[]> Images { get; set; } | |||||
| public List<byte[]> Images { get; } | |||||
| /// <summary> | /// <summary> | ||||
| /// Current "mu" value for mirostat sampling | /// Current "mu" value for mirostat sampling | ||||
| @@ -2,9 +2,9 @@ | |||||
| ```cs | ```cs | ||||
| using System.Text.RegularExpressions; | using System.Text.RegularExpressions; | ||||
| using LLama.Batched; | |||||
| using LLama.Common; | using LLama.Common; | ||||
| using Spectre.Console; | using Spectre.Console; | ||||
| using LLama.Native; | |||||
| namespace LLama.Examples.Examples | namespace LLama.Examples.Examples | ||||
| { | { | ||||
| @@ -21,11 +21,8 @@ namespace LLama.Examples.Examples | |||||
| var prompt = $"{{{modelImage}}}\nUSER:\nProvide a full description of the image.\nASSISTANT:\n"; | var prompt = $"{{{modelImage}}}\nUSER:\nProvide a full description of the image.\nASSISTANT:\n"; | ||||
| var parameters = new ModelParams(modelPath) | |||||
| { | |||||
| ContextSize = 4096, | |||||
| Seed = 1337, | |||||
| }; | |||||
| var parameters = new ModelParams(modelPath); | |||||
| using var model = LLamaWeights.LoadFromFile(parameters); | using var model = LLamaWeights.LoadFromFile(parameters); | ||||
| using var context = model.CreateContext(parameters); | using var context = model.CreateContext(parameters); | ||||
| @@ -48,16 +45,16 @@ namespace LLama.Examples.Examples | |||||
| var imageMatches = Regex.Matches(prompt, "{([^}]*)}").Select(m => m.Value); | var imageMatches = Regex.Matches(prompt, "{([^}]*)}").Select(m => m.Value); | ||||
| var imageCount = imageMatches.Count(); | var imageCount = imageMatches.Count(); | ||||
| var hasImages = imageCount > 0; | var hasImages = imageCount > 0; | ||||
| byte[][] imageBytes = null; | |||||
| if (hasImages) | if (hasImages) | ||||
| { | { | ||||
| var imagePathsWithCurlyBraces = Regex.Matches(prompt, "{([^}]*)}").Select(m => m.Value); | var imagePathsWithCurlyBraces = Regex.Matches(prompt, "{([^}]*)}").Select(m => m.Value); | ||||
| var imagePaths = Regex.Matches(prompt, "{([^}]*)}").Select(m => m.Groups[1].Value); | |||||
| var imagePaths = Regex.Matches(prompt, "{([^}]*)}").Select(m => m.Groups[1].Value).ToList(); | |||||
| List<byte[]> imageBytes; | |||||
| try | try | ||||
| { | { | ||||
| imageBytes = imagePaths.Select(File.ReadAllBytes).ToArray(); | |||||
| imageBytes = imagePaths.Select(File.ReadAllBytes).ToList(); | |||||
| } | } | ||||
| catch (IOException exception) | catch (IOException exception) | ||||
| { | { | ||||
| @@ -70,15 +67,17 @@ namespace LLama.Examples.Examples | |||||
| break; | break; | ||||
| } | } | ||||
| // Each prompt with images we clear cache | |||||
| // When the prompt contains images we clear KV_CACHE to restart conversation | |||||
| // See: | |||||
| // https://github.com/ggerganov/llama.cpp/discussions/3620 | |||||
| ex.Context.NativeHandle.KvCacheRemove( LLamaSeqId.Zero, -1, -1 ); | |||||
| int index = 0; | int index = 0; | ||||
| foreach (var path in imagePathsWithCurlyBraces) | foreach (var path in imagePathsWithCurlyBraces) | ||||
| { | { | ||||
| // First image replace to tag <image, the rest of the images delete the tag | // First image replace to tag <image, the rest of the images delete the tag | ||||
| if (index++ == 0) | |||||
| prompt = prompt.Replace(path, "<image>"); | |||||
| else | |||||
| prompt = prompt.Replace(path, ""); | |||||
| prompt = prompt.Replace(path, index++ == 0 ? "<image>" : ""); | |||||
| } | } | ||||
| @@ -101,7 +100,10 @@ namespace LLama.Examples.Examples | |||||
| // Initilize Images in executor | // Initilize Images in executor | ||||
| // | // | ||||
| ex.ImagePaths = imagePaths.ToList(); | |||||
| foreach (var image in imagePaths) | |||||
| { | |||||
| ex.Images.Add(await File.ReadAllBytesAsync(image)); | |||||
| } | |||||
| } | } | ||||
| Console.ForegroundColor = Color.White; | Console.ForegroundColor = Color.White; | ||||
| @@ -116,7 +118,7 @@ namespace LLama.Examples.Examples | |||||
| // let the user finish with exit | // let the user finish with exit | ||||
| // | // | ||||
| if (prompt.Equals("/exit", StringComparison.OrdinalIgnoreCase)) | |||||
| if (prompt != null && prompt.Equals("/exit", StringComparison.OrdinalIgnoreCase)) | |||||
| break; | break; | ||||
| } | } | ||||
| @@ -28,9 +28,9 @@ public interface ILLamaExecutor | |||||
| public LLavaWeights? ClipModel { get; } | public LLavaWeights? ClipModel { get; } | ||||
| /// <summary> | /// <summary> | ||||
| /// List of images: Image filename and path (jpeg images). | |||||
| /// List of images: List of images in byte array format. | |||||
| /// </summary> | /// </summary> | ||||
| public List<string> ImagePaths { get; set; } | |||||
| public List<byte[]> Images { get; } | |||||
| /// <summary> | /// <summary> | ||||