First
This commit is contained in:
parent
5a072d314d
commit
41aa593019
@ -1,22 +1,18 @@
|
|||||||
cmake_minimum_required(VERSION 3.20)
|
cmake_minimum_required(VERSION 3.20)
|
||||||
project(Xenith)
|
project(Xenith)
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 17) # В Makefile указан c++17
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
# Опции компиляции из твоего Makefile
|
|
||||||
# Для Debug сборки CLion обычно сам добавляет -O0 -g, но можно форсировать
|
|
||||||
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||||
set(CMAKE_CXX_FLAGS_DEBUG "-O1 -g -fsanitize=address,undefined")
|
set(CMAKE_CXX_FLAGS_DEBUG "-O1 -g -fsanitize=address,undefined")
|
||||||
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "-fsanitize=address,undefined")
|
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "-fsanitize=address,undefined")
|
||||||
else()
|
else()
|
||||||
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -march=native -ffast-math -funroll-loops")
|
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -ffast-math -funroll-loops")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Добавляем предупреждения
|
|
||||||
add_compile_options(-Wall -Wextra -Wno-unused-parameter)
|
add_compile_options(-Wall -Wextra -Wno-unused-parameter)
|
||||||
|
|
||||||
# Список исходных файлов из твоего Makefile
|
|
||||||
set(SOURCES
|
set(SOURCES
|
||||||
main.cpp
|
main.cpp
|
||||||
xenith/core/model.cpp
|
xenith/core/model.cpp
|
||||||
|
|||||||
17
README.md
17
README.md
@ -3,11 +3,6 @@
|
|||||||
Трансформер на чистом C++: обучение и генерация текста на CPU, без внешних
|
Трансформер на чистом C++: обучение и генерация текста на CPU, без внешних
|
||||||
зависимостей. Всё в одном бинарнике.
|
зависимостей. Всё в одном бинарнике.
|
||||||
|
|
||||||
```
|
|
||||||
make # собрать -> bin/xenith
|
|
||||||
./bin/xenith --help
|
|
||||||
```
|
|
||||||
|
|
||||||
## Что внутри
|
## Что внутри
|
||||||
|
|
||||||
Архитектура — как у LLaMA: pre-norm, RMSNorm, RoPE, SwiGLU, связанные
|
Архитектура — как у LLaMA: pre-norm, RMSNorm, RoPE, SwiGLU, связанные
|
||||||
@ -28,15 +23,15 @@ make # собрать -> bin/xenith
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 1) собрать модель из своего текста
|
# 1) собрать модель из своего текста
|
||||||
./bin/xenith new models/my.xnh --corpus data.txt \
|
./bin/Xenith new models/my.xnh --corpus data.txt \
|
||||||
--vocab 512 --embd 128 --layers 6 --heads 8 --ctx 256
|
--vocab 512 --embd 128 --layers 6 --heads 8 --ctx 256
|
||||||
|
|
||||||
# 2) обучить
|
# 2) обучить
|
||||||
./bin/xenith train models/my.xnh --corpus data.txt \
|
./bin/Xenith train models/my.xnh --corpus data.txt \
|
||||||
--out models/my_trained.xnh --steps 5000 --batch 16 --lr 3e-4
|
--out models/my_trained.xnh --steps 5000 --batch 16 --lr 3e-4
|
||||||
|
|
||||||
# 3) сгенерировать
|
# 3) сгенерировать
|
||||||
./bin/xenith gen models/my_trained.xnh --prompt "Привет" --n 200 --temp 0.8
|
./bin/Xenith gen models/my_trained.xnh --prompt "Привет" --n 200 --temp 0.8
|
||||||
```
|
```
|
||||||
|
|
||||||
## Команды
|
## Команды
|
||||||
@ -105,9 +100,9 @@ make # собрать -> bin/xenith
|
|||||||
### info / gradcheck / bench
|
### info / gradcheck / bench
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./bin/xenith info models/my.xnh # конфигурация и словарь
|
./bin/Xenith info models/my.xnh # конфигурация и словарь
|
||||||
./bin/xenith gradcheck # градиенты против численных
|
./bin/Xenith gradcheck # градиенты против численных
|
||||||
./bin/xenith bench models/my.xnh # скорость
|
./bin/Xenith bench models/my.xnh # скорость
|
||||||
```
|
```
|
||||||
|
|
||||||
`gradcheck` стоит запускать после любой правки в `model.cpp` / `backward.cpp` —
|
`gradcheck` стоит запускать после любой правки в `model.cpp` / `backward.cpp` —
|
||||||
|
|||||||
65
main.cpp
65
main.cpp
@ -77,12 +77,13 @@ static void usage() {
|
|||||||
xenith <команда> [опции]
|
xenith <команда> [опции]
|
||||||
|
|
||||||
КОМАНДЫ
|
КОМАНДЫ
|
||||||
new создать новую модель из корпуса
|
new создать новую модель из корпуса
|
||||||
train обучить существующую модель
|
train обучить существующую модель
|
||||||
gen сгенерировать текст
|
gen сгенерировать текст
|
||||||
info показать конфигурацию модели
|
info показать конфигурацию модели
|
||||||
gradcheck проверить градиенты численно
|
gradcheck проверить градиенты численно
|
||||||
bench замерить скорость форварда и шага обучения
|
bench замерить скорость форварда и шага обучения
|
||||||
|
ollama запустьтить сервер с api ollama
|
||||||
|
|
||||||
ПРИМЕРЫ
|
ПРИМЕРЫ
|
||||||
xenith new model.xnh --corpus data.txt --vocab 512 --embd 64 --layers 4 --heads 4
|
xenith new model.xnh --corpus data.txt --vocab 512 --embd 64 --layers 4 --heads 4
|
||||||
@ -131,6 +132,10 @@ static void usage() {
|
|||||||
--no-stream не печатать в процессе
|
--no-stream не печатать в процессе
|
||||||
--batch "a;b;c" несколько промптов через ;
|
--batch "a;b;c" несколько промптов через ;
|
||||||
--show-tokens показать id токенов
|
--show-tokens показать id токенов
|
||||||
|
|
||||||
|
ОПЦИИ ollama
|
||||||
|
--port PORT порт на котором будет открыт сервер
|
||||||
|
--conf NAME.conf
|
||||||
)");
|
)");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -297,6 +302,53 @@ static int cmd_bench(const Args& a) {
|
|||||||
return run_bench(ck, a.geti("iters", 20), a.geti("block", 64));
|
return run_bench(ck, a.geti("iters", 20), a.geti("block", 64));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int cmd_ollama(const Args& a) {
|
||||||
|
if (a.pos.empty()) { fprintf(stderr, "gen: укажите файл модели\n"); return 1; }
|
||||||
|
Checkpoint ck;
|
||||||
|
std::string err;
|
||||||
|
if (!load_checkpoint(a.pos[0], ck, err)) { fprintf(stderr, "gen: %s\n", err.c_str()); return 1; }
|
||||||
|
|
||||||
|
GenConfig gc;
|
||||||
|
gc.max_new_tokens = a.geti("n", 200);
|
||||||
|
gc.temperature = a.getf("temp", 0.8f);
|
||||||
|
gc.top_k = a.geti("top-k", 40);
|
||||||
|
gc.top_p = a.getf("top-p", 0.95f);
|
||||||
|
gc.seed = a.geti("seed", -1);
|
||||||
|
gc.stream = !a.has("no-stream");
|
||||||
|
|
||||||
|
if (a.has("batch")) {
|
||||||
|
std::vector<std::string> prompts;
|
||||||
|
std::string s = a.get("batch");
|
||||||
|
size_t start = 0;
|
||||||
|
while (start <= s.size()) {
|
||||||
|
size_t p = s.find(';', start);
|
||||||
|
if (p == std::string::npos) { prompts.push_back(s.substr(start)); break; }
|
||||||
|
prompts.push_back(s.substr(start, p - start));
|
||||||
|
start = p + 1;
|
||||||
|
}
|
||||||
|
gc.stream = false;
|
||||||
|
std::vector<std::string> outs = generate_batch(ck.params, ck.tok, prompts, gc);
|
||||||
|
for (size_t i = 0; i < outs.size(); ++i) {
|
||||||
|
printf("=== промпт %zu: %s\n%s\n\n", i + 1, prompts[i].c_str(), outs[i].c_str());
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string prompt = a.get("prompt", "");
|
||||||
|
if (a.pos.size() > 1) prompt = a.pos[1];
|
||||||
|
|
||||||
|
std::vector<int> ids;
|
||||||
|
std::string text = generate(ck.params, ck.tok, prompt, gc, &ids);
|
||||||
|
|
||||||
|
if (a.has("show-tokens")) {
|
||||||
|
printf("\n--- токены (%zu) ---\n", ids.size());
|
||||||
|
for (size_t i = 0; i < ids.size(); ++i)
|
||||||
|
printf("%d ", ids[i]);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
if (argc < 2) { usage(); return 1; }
|
if (argc < 2) { usage(); return 1; }
|
||||||
const std::string cmd = argv[1];
|
const std::string cmd = argv[1];
|
||||||
@ -309,6 +361,7 @@ int main(int argc, char** argv) {
|
|||||||
if (cmd == "info") return cmd_info(a);
|
if (cmd == "info") return cmd_info(a);
|
||||||
if (cmd == "gradcheck") return cmd_gradcheck(a);
|
if (cmd == "gradcheck") return cmd_gradcheck(a);
|
||||||
if (cmd == "bench") return cmd_bench(a);
|
if (cmd == "bench") return cmd_bench(a);
|
||||||
|
if (cmd == "ollama") return cmd_bench(a);
|
||||||
|
|
||||||
fprintf(stderr, "неизвестная команда: %s\n\n", cmd.c_str());
|
fprintf(stderr, "неизвестная команда: %s\n\n", cmd.c_str());
|
||||||
usage();
|
usage();
|
||||||
|
|||||||
BIN
models/my.xnh
Normal file
BIN
models/my.xnh
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user