char-fork/llama.cpp

git clone https://git.t4t.associates/char-fork/llama.cpp

Aaron Teoargs: refactor mlock/mmap/directio into load-mode (#20834)e6dd0e29a

char/aliceai-t5-moe
3.3 KiB100 linesraw
1#include "arg.h"
2#include "common.h"
3#include "log.h"
4#include "llama.h"
5
6#include <clocale>
7#include <cmath>
8#include <cstdio>
9#include <cstring>
10#include <ctime>
11#include <vector>
12
13#if defined(_MSC_VER)
14#pragma warning(disable: 4244 4267)  // possible loss of data
15#endif
16
17int main(int argc, char ** argv) {
18    std::setlocale(LC_NUMERIC, "C");
19
20    common_params params;
21    params.escape = false;
22
23    common_init();
24
25    if (!common_params_parse(argc, argv, params, LLAMA_EXAMPLE_FINETUNE)) {
26        return 1;
27    }
28
29    if (params.load_mode != LLAMA_LOAD_MODE_NONE) {
30        LOG_INF("%s: forcing load_mode = none to enable writable pointers to the weights\n", __func__);
31        params.load_mode = LLAMA_LOAD_MODE_NONE;
32    }
33    if (params.cache_type_k != GGML_TYPE_F32) {
34        LOG_INF("%s: force changing k cache type to f32 due to a lack of f16 support for OUT_PROD\n", __func__);
35        params.cache_type_k = GGML_TYPE_F32;
36    }
37    if (params.cache_type_v != GGML_TYPE_F32) {
38        LOG_INF("%s: force changing v cache type to f32 due to a lack of f16 support for OUT_PROD\n", __func__);
39        params.cache_type_v = GGML_TYPE_F32;
40    }
41
42    llama_backend_init();
43    llama_numa_init(params.numa);
44    // load the model and apply lora adapter, if any
45    auto llama_init = common_init_from_params(params);
46
47    auto * model = llama_init->model();
48    auto * ctx   = llama_init->context();
49
50    if (model == NULL) {
51        LOG_ERR("%s: unable to load model\n", __func__);
52        return 1;
53    }
54
55    // print system information
56    {
57        LOG_INF("\n");
58        LOG_INF("%s\n", common_params_get_system_info(params).c_str());
59    }
60
61    std::vector<llama_token> tokens  = common_tokenize(ctx, params.prompt, true);
62    ggml_opt_dataset_t       dataset = common_opt_dataset_init(ctx, tokens, llama_n_ctx(ctx) / 2);
63
64    struct lr_opt & lr = params.lr;
65    LOG_INF("-optimizer %s -lr0 %.2g -wd %.2g -lr-min %.2g -min-epochs %.2g -epochs %d -period %.2g -val %.2g\n",
66            ggml_opt_optimizer_name(params.optimizer), (double) lr.lr0, (double) lr.wd, (double) lr.lr_min, (double) lr.decay_epochs,
67            (unsigned) lr.epochs, (double) params.n_batch / params.n_ubatch, (double) params.val_split);
68
69    struct llama_opt_params lopt_params{
70        /*n_ctx_train     =*/0,
71        /*param_filter    =*/llama_opt_param_filter_all,
72        /*param_filter_ud =*/nullptr,
73        /*get_opt_pars    =*/common_opt_lr_pars,
74        /*get_opt_pars_ud =*/&params.lr,
75        /*optimizer_type  =*/params.optimizer,
76    };
77    llama_opt_init(ctx, model, lopt_params);
78
79    const int64_t idata_split = ggml_opt_dataset_ndata(dataset) * (1.0f - params.val_split);
80
81    ggml_opt_result_t result_train = ggml_opt_result_init();
82    ggml_opt_result_t result_eval  = ggml_opt_result_init();
83
84    for (lr.epoch = 0; lr.epoch < lr.epochs; ++lr.epoch) {
85        llama_opt_epoch(ctx, dataset, result_train, result_eval, idata_split,
86                        ggml_opt_epoch_callback_progress_bar, ggml_opt_epoch_callback_progress_bar);
87        fprintf(stderr, "\n");
88
89        ggml_opt_result_reset(result_train);
90        ggml_opt_result_reset(result_eval);
91    }
92    ggml_opt_result_free(result_train);
93    ggml_opt_result_free(result_eval);
94
95    llama_model_save_to_file(model, params.out_file.c_str());
96
97    llama_backend_free();
98
99    return 0;
100}