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.

IModelParamsExtensions.cs 3.2 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. using System.IO;
  2. using System;
  3. using System.Text;
  4. using LLama.Abstractions;
  5. using LLama.Native;
  6. namespace LLama.Extensions;
  7. /// <summary>
  8. /// Extention methods to the IModelParams interface
  9. /// </summary>
  10. public static class IModelParamsExtensions
  11. {
  12. /// <summary>
  13. /// Convert the given `IModelParams` into a `LLamaModelParams`
  14. /// </summary>
  15. /// <param name="params"></param>
  16. /// <param name="result"></param>
  17. /// <returns></returns>
  18. /// <exception cref="FileNotFoundException"></exception>
  19. /// <exception cref="ArgumentException"></exception>
  20. public static IDisposable ToLlamaModelParams(this IModelParams @params, out LLamaModelParams result)
  21. {
  22. if (@params.UseMemoryLock && !NativeApi.llama_mlock_supported())
  23. throw new NotSupportedException("'UseMemoryLock' is not supported (llama_mlock_supported() == false)");
  24. if (@params.UseMemorymap && !NativeApi.llama_mmap_supported())
  25. throw new NotSupportedException("'UseMemorymap' is not supported (llama_mmap_supported() == false)");
  26. var disposer = new GroupDisposable();
  27. result = NativeApi.llama_model_default_params();
  28. result.main_gpu = @params.MainGpu;
  29. result.n_gpu_layers = @params.GpuLayerCount;
  30. result.use_mlock = @params.UseMemoryLock;
  31. result.use_mmap = @params.UseMemorymap;
  32. result.vocab_only = @params.VocabOnly;
  33. unsafe
  34. {
  35. result.tensor_split = (float*)disposer.Add(@params.TensorSplits.Pin()).Pointer;
  36. }
  37. if (@params.MetadataOverrides.Count == 0)
  38. {
  39. unsafe
  40. {
  41. result.kv_overrides = (LLamaModelMetadataOverride*)IntPtr.Zero;
  42. }
  43. }
  44. else
  45. {
  46. // Allocate enough space for all the override items. Pin it in place so we can safely pass it to llama.cpp
  47. // This is one larger than necessary. The last item indicates the end of the overrides.
  48. var overrides = new LLamaModelMetadataOverride[@params.MetadataOverrides.Count + 1];
  49. unsafe
  50. {
  51. result.kv_overrides = (LLamaModelMetadataOverride*)disposer.Add(overrides.AsMemory().Pin()).Pointer;
  52. }
  53. // Convert each item
  54. for (var i = 0; i < @params.MetadataOverrides.Count; i++)
  55. {
  56. unsafe
  57. {
  58. // Get the item to convert
  59. var item = @params.MetadataOverrides[i];
  60. // Create the "native" representation to fill in
  61. var native = new LLamaModelMetadataOverride
  62. {
  63. Tag = item.Type
  64. };
  65. // Write the value into the native struct
  66. item.WriteValue(ref native);
  67. // Convert key chars to bytes
  68. var srcSpan = item.Key.AsSpan();
  69. var dstSpan = new Span<byte>(native.key, 128);
  70. Encoding.UTF8.GetBytes(srcSpan, dstSpan);
  71. // Store it in the array
  72. overrides[i] = native;
  73. }
  74. }
  75. }
  76. return disposer;
  77. }
  78. }