Мой опыт использования "Локальных LLM" пока невелик и в основном касается использования наверное самой простой оболочки для LLM gpt4all и нескольких сравнительно простых моделей . (содержащих от 3 до 9 миллиардов параметров)
Резюмируя полученный опыт могу сказать что все работает заметно лучше чем я ожидал но практическое применение сталкивается со множеством довольно неочевидных проблем .
Например неожиданно оказалось, что многие модели вполне неплохо понимают русский язык но только имеющие специальную адаптацию умеют обращаться с ним достаточно надежно .
Оболочка gpt4all умеет работать как с использованием CPU так и GPU (+ дополнительно умеет каким-то образом использовать API "Вулкан" )
Системные требования щадящие 8-16 гигабайт памяти на компе ( но разумеется "чем больше тем лучше" ), а нижняя граница требований к GPU довольно размазана(Например у меня на карте 4гб видеопамяти, но я вполне могу использовать модели размером в 6-7-ть гигабайт в "GPU режиме")
Скорость работы для LLM "понятие относительное" ( очень многое зависит от конкретной задачи ) но в отличии от опыта локального использования "Стабильной Диффузии "( генерации изображений) почти нет ощущения "клаустрофобии" из за нехватки вычислительной мощности и ресурсов.
Лучшие показатели 9-10 токенов(слов) в секунду но и скромные 1.5 -2 токена в секунду вполне оправдывают затраченное на получение ответа время из за временами просто огромного объёма работы которую иногда подделывает нейросеть в процессе генерации ответа.
"Уровень осведомлённости" нейросети LLM штука довольно забавная например можно на прямую спросить модель что-то вроде
"What mathematical methods for scaling bitmap images are known to this model available for implementing them as functions in the Pascal programming language? (Now I am interested only in the list and brief description, not in the functions themselves)"
(То есть: Какие математические методы масштабирования растровых изображений известны данной модели,из доступных для реализации их в виде функций на языке программирования Pascal? (Сейчас меня интересует только список и краткое описание, а не сами функции))
В ответ мы получи некий довольно куцый список например из 4 методов ...
Но если спросить так1 Bilinear Interpolation: A simple method that estimates the pixel value at a scaled position by averaging neighboring pixels.
2 Bicubic Interpolation: An improved version of bilinear interpolation, using more neighboring pixels to estimate the target pixel value.
3 Nearest Neighbor (NN): Simply copies the original pixel values without any interpolation or resampling.
4 Box Filter: A simple filter that replaces each pixel with a weighted average of its neighbors.
Напиши семь простых функций масштабирования растрового изображения на языке программирования Паскаль (используя FPC + Lazarus)
Исходные данные: изображение типа TBitmap требуемые Ширина и Высота. Выходные данные: изображение типа TBitmap.
Используя шаблон Function ScaleИмяМетода(B:TBitmap;W,H:Integer):TBitmap;
от быстрых и небольших по размеру кода к медленными сложным выдавая их по одной с остановками.
(продолжая ответ на запрос по команде "Дальше" )
То внезапно оказывается, что модель (Успешно достав "из закромов родины " еще три метода ) знает больше чем сама про это знает !
5 Lanczos Filter: An improved box filter, using a larger kernel to reduce aliasing artifacts.
6 Catmull-Rom Splines: A method for creating smooth curves by connecting neighboring pixels and applying Catmull-Rom splines.
7 B-Spline Interpolation: Similar to Catmull-Rom splines, but uses B-splines instead of Catmull-Rom splines.
(Правда если пожадничать и написать "Напиши десять функций" то есть не плохой шанс, что "сильно озадаченную" модель "хватит удар" и она начнет "честно и искренне галлюцинировать" на предмет "квантовых резонансных распределений" и тому подобного псевдонаучного бреда , а попытавшись реализовать этих "монстров ЕГГО-ЛОГИИ" в реальном коде "честно и доблестно" повесит комп )
"Едим дальше"(тм)
У оболочки gpt4all есть очень полезная фишка которая называется "Коллекции локальных документов" которая позволяет использовать файлы в локальной папке в качестве "внешнего контекста" который доступен для анализа по запросу.
Но есть проблема: ЦЕЛИКОМ переработать или перевести текст из "внешнего контекста" сходу не получится, а разные ухищрения типа "переводи текст по одному абзацу" работают с "переменным успехом" .
Добавлено спустя 57 минут:
Еще одна интересная фишка !
Если просто спросить написать код функции на "диалекте FPC"
То получим что-то такое
- Код: Выделить всё
- Function GetNearestNeighbor(const B: TBitmap; x, y: Single):TColor;
 var nx, ny: Integer; begin
 nx := Round(x); ny := Round(y);
 if (nx >= 0) and (ny >= 0) and (nx < B.Width) and (ny < B.Height) then
 GetNearestNeighbor := B.Canvas.Pixels[ny, nx];
 end;
 Function ScaleNearest(B:TBitmap;W,H:Integer):TBitmap;
 var
 nWidth, nHeight: Integer; i, j: Integer;
 NewPixel: TColor;
 begin
 Result := TBitmap.Create;
 Result.Width := W;
 Result.Height := H;
 nWidth := B.Width; nHeight := B.Height;
 for i := 0 to Result.Height - 1 do
 for j := 0 to Result.Width - 1 do
 begin
 NewPixel := GetNearestNeighbor(B,jnWidth/Result.Width,inHeight/Result.Height);
 Result.Canvas.Pixels[i,j] := NewPixel;
 end;
 end;
(То есть очень медленный Canvas-код .)
Но можно спросить ИНАЧЕ .
И получить "другое дело"...
- Код: Выделить всё
- //Конечно, вот примеры функций масштабирования с использованием
 //прямого доступа к данным изображения TBitmap.RawImage.Data:
 //Функция Nearest Neighbor:
 function ScaleNearestNeighbor(B: TBitmap; W, H: Integer): TBitmap;
 var
 NewBmp: TBitmap;
 SrcPtr, DestPtr: Pointer;
 X, Y: Integer;
 begin
 NewBmp := TBitmap.Create;
 try
 NewBmp.Width := W;
 NewBmp.Height := H;
 NewBmp.PixelFormat := B.PixelFormat;
 // Выделение памяти для нового изображения
 SetLength(NewBmp.RawImage.Data, NewBmp.Width * NewBmp.Height * (B.PixelFormat.BytesPerLine / 8));
 SrcPtr := B.RawImage.Data;
 DestPtr := NewBmp.RawImage.Data;
 for Y := 0 to H - 1 do
 for X := 0 to W - 1 do begin
 // Вычисление индекса пикселя в исходном изображении
 var SrcX, SrcY: Integer;
 SrcX := (X * B.Width) / NewBmp.Width;
 SrcY := (Y * B.Height) / NewBmp.Height;
 // Копирование значения пикселя из исходного изображения в новое изображение
 Move(SrcPtr + SrcY * B.PixelFormat.BytesPerLine + SrcX * B.PixelFormat.BytesPerElement, DestPtr + Y * NewBmp.Width * (B.PixelFormat.BytesPerLine / 8) + X * (B.PixelFormat.BytesPerLine / 8), B.PixelFormat.BytesPerElement);
 end;
 Result := NewBmp;
 end;


