Мой опыт использования "Локальных 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;