go-llama-new.cpp
Go-обёртка над llama.cpp с API, совместимым с go-skynet/go-llama.cpp: те же имена типов, функций и экспортируемых переменных (LLama, New, Predict, SetContext, EnableEmbeddings и т.д.).
Ядро собирается из локальных исходников llama.cpp (не из submodule внутри репозитория). Пути к исходникам задаются в файле build.conf, переменные окружения для этого не используются.
Требования
- Go 1.21 или новее (с поддержкой CGO)
- Компилятор C++ с поддержкой C++17 (
g++/clang++) - CMake 3.14+
- make, ar
- OpenMP (обычно пакет
libgompв Linux) - Инструменты сборки:
git,build-essential(или аналог)
Для линковки также нужны статические библиотеки, которые CMake собирает из llama.cpp: libllama.a, libllama-common.a, libllama-common-base.a, libggml*.a, libcpp-httplib.a.
Настройка путей
Отредактируйте build.conf в корне модуля:
# Пути к исходникам llama.cpp (без переменных окружения)
LLAMA_CPP_PATH=/home/admin/cpp/llama.cpp
LLAMA_BUILD_PATH=/home/admin/cpp/llama.cpp/build
| Параметр | Описание |
|---|---|
LLAMA_CPP_PATH |
Каталог с исходниками llama.cpp (include/, common/, src/ и т.д.) |
LLAMA_BUILD_PATH |
Каталог сборки CMake (там появятся build/src/libllama.a и др.) |
После изменения build.conf выполните make — будет пересоздан cgo_flags.go с актуальными путями для CGO.
Сборка
Сборка состоит из двух этапов: сначала нативное ядро llama.cpp, затем Go-модуль с C-обёрткой binding.
1. Сборка llama.cpp
mkdir -p /home/admin/cpp/llama.cpp/build
cd /home/admin/cpp/llama.cpp/build
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_SHARED_LIBS=OFF
cmake --build . --target llama llama-common -j"$(nproc)"
Проверка, что библиотеки на месте:
ls -la build/src/libllama.a
ls -la build/common/libllama-common.a
ls -la build/common/libllama-common-base.a
ls -la build/ggml/src/libggml.a
Цель make в каталоге модуля при необходимости запустит эту же сборку автоматически (см. Makefile).
2. Сборка C-обёртки (libbinding.a)
В каталоге модуля:
cd /path/to/go-llama-new.cpp
make
Будет выполнено:
- Генерация
cgo_flags.goизbuild.conf - Компиляция
binding.cpp→binding.o - Создание архива
libbinding.a
Очистка артефактов обёртки:
make clean
3. Сборка Go-модуля
go build ./...
Или пример:
go build -o llama-example ./examples/
go run ./examples/main.go /path/to/model.gguf "Привет, мир"
При первой сборке CGO скомпилирует binding.cpp ещё раз и слинкует его с библиотеками из LLAMA_BUILD_PATH (см. cgo_flags.go).
Использование в своём проекте
import llama "go-llama-new.cpp"
func main() {
model, err := llama.New("/path/to/model.gguf",
llama.SetContext(4096),
llama.SetGPULayers(0),
)
if err != nil {
panic(err)
}
defer model.Free()
text, err := model.Predict("Привет",
llama.SetTokens(128),
llama.SetTemperature(0.8),
)
if err != nil {
panic(err)
}
println(text)
}
В go.mod вашего проекта:
require go-llama-new.cpp v0.0.0
replace go-llama-new.cpp => /path/to/go-llama-new.cpp
Перед go build в проекте-потребителе должны быть собраны llama.cpp и libbinding.a (шаги 1–2 выше).
Опциональные теги сборки
Как в оригинальном go-llama.cpp:
| Тег | Назначение |
|---|---|
openblas |
Дополнительная линковка с OpenBLAS (llama_openblas.go) |
cublas |
CUDA (llama_cublas.go) — требует отдельной сборки llama.cpp с GGML_CUDA=ON |
Пример:
go build -tags openblas ./...
Для GPU нужно пересобрать llama.cpp с нужными опциями CMake (например -DGGML_CUDA=ON) и убедиться, что пути в build.conf указывают на эту сборку.
Устранение неполадок
неопределённая ссылка на llama_compiler / llama_commit / llama_build_number
Не слинкована libllama-common-base.a. Убедитесь, что в cgo_flags.go в LDFLAGS есть -lllama-common-base, и пересоберите:
make
go build ./...
cannot find -lllama или -lllama-common
Проверьте LLAMA_BUILD_PATH в build.conf и выполните сборку llama.cpp (шаг 1).
CGO отключён
go env CGO_ENABLED # должно быть 1
Установите gcc/g++, если CGO выключен из-за отсутствия компилятора C.
Изменили путь к llama.cpp
- Обновите
build.conf make(обновитcgo_flags.goиlibbinding.a)go build ./...
Структура репозитория
.
├── build.conf # пути к llama.cpp
├── binding.h
├── binding.cpp # C API для CGO
├── cgo_flags.go # флаги CGO (генерируется make)
├── llama.go
├── options.go
├── Makefile
├── examples/main.go
└── README.md
Лицензия
Следует лицензиям llama.cpp и исходного go-llama.cpp. Используйте в соответствии с условиями соответствующих проектов.