std::string arg;
const std::string arg_prefix = "--";
gpt_params & params = ctx_arg.params;
- gpt_sampler_params & sparams = params.sparams;
std::unordered_map<std::string, llama_arg *> arg_to_options;
for (auto & opt : ctx_arg.options) {
params.kv_overrides.back().key[0] = 0;
}
- if (sparams.seed == LLAMA_DEFAULT_SEED) {
- sparams.seed = time(NULL);
- }
-
return true;
}
).set_sparam());
add_opt(llama_arg(
{"-s", "--seed"}, "SEED",
- format("RNG seed (default: %d, use random seed for < 0)", params.sparams.seed),
+ format("RNG seed (default: %u, use random seed for %u)", params.sparams.seed, LLAMA_DEFAULT_SEED),
[](gpt_params & params, const std::string & value) {
params.sparams.seed = std::stoul(value);
}
print_build_info();
- LOG_TEE("%s: seed = %u\n", __func__, params.sparams.seed);
-
LOG("%s: llama backend init\n", __func__);
llama_backend_init();
llama_numa_init(params.numa);
LOG_TEE("Input suffix: '%s'\n", params.input_suffix.c_str());
}
}
+ smpl = gpt_sampler_init(model, sparams);
+
+ LOG_TEE("sampling seed: %u\n", gpt_sampler_get_seed(smpl));
LOG_TEE("sampling: \n%s\n", sparams.print().c_str());
LOG_TEE("generate: n_ctx = %d, n_batch = %d, n_predict = %d, n_keep = %d\n", n_ctx, params.n_batch, params.n_predict, params.n_keep);
LOG_TEE("\n\n");
std::vector<llama_token> embd;
- smpl = gpt_sampler_init(model, sparams);
-
while (n_remain != 0 || params.interactive) {
// predict
if (!embd.empty()) {
#include <cstring>
#include <ctime>
#include <cfloat>
+#include <chrono>
#include <cmath>
#include <numeric>
#include <random>
cur_p->size = k;
}
+static uint32_t get_rng_seed(uint32_t seed) {
+ if (seed == LLAMA_DEFAULT_SEED) {
+ // use system clock if std::random_device is not a true RNG
+ static bool is_rd_prng = std::random_device().entropy() == 0;
+ if (is_rd_prng) {
+ return (uint32_t) std::chrono::system_clock::now().time_since_epoch().count();
+ }
+ std::random_device rd;
+ return rd();
+ }
+ return seed;
+}
+
// llama_sampler API
const char * llama_sampler_name(const struct llama_sampler * smpl) {
struct llama_sampler_dist {
const uint32_t seed;
+ uint32_t seed_cur;
std::mt19937 rng;
};
static void llama_sampler_dist_reset(struct llama_sampler * smpl) {
auto * ctx = (llama_sampler_dist *) smpl->ctx;
- ctx->rng = std::mt19937(ctx->seed);
+ ctx->seed_cur = get_rng_seed(ctx->seed);
+ ctx->rng.seed(ctx->seed_cur);
}
static void llama_sampler_dist_free(struct llama_sampler * smpl) {
};
struct llama_sampler * llama_sampler_init_dist(uint32_t seed) {
+ auto seed_cur = get_rng_seed(seed);
return new llama_sampler {
/* .iface = */ &llama_sampler_dist_i,
/* .ctx = */ new llama_sampler_dist {
- /* .seed = */ seed,
- /* .rng = */ std::mt19937(seed),
+ /* .seed = */ seed,
+ /* .seed_cur = */ seed_cur,
+ /* .rng = */ std::mt19937(seed_cur),
},
};
}
const int32_t n_vocab;
const uint32_t seed;
+ uint32_t seed_cur;
const float tau;
const float eta;
static void llama_sampler_mirostat_reset(struct llama_sampler * smpl) {
auto * ctx = (llama_sampler_mirostat *) smpl->ctx;
ctx->mu = 2.0f*ctx->tau;
- ctx->rng = std::mt19937(ctx->seed);
+ ctx->seed_cur = get_rng_seed(ctx->seed);
+ ctx->rng.seed(ctx->seed_cur);
}
static void llama_sampler_mirostat_free(struct llama_sampler * smpl) {
};
struct llama_sampler * llama_sampler_init_mirostat(int32_t n_vocab, uint32_t seed, float tau, float eta, int32_t m) {
+ auto seed_cur = get_rng_seed(seed);
return new llama_sampler {
/* .iface = */ &llama_sampler_mirostat_i,
/* .ctx = */ new llama_sampler_mirostat {
- /* .n_vocab = */ n_vocab,
- /* .seed = */ seed,
- /* .tau = */ tau,
- /* .eta = */ eta,
- /* .m = */ m,
- /* .mu = */ 2.0f*tau,
- /* .rng = */ std::mt19937(seed),
+ /* .n_vocab = */ n_vocab,
+ /* .seed = */ seed,
+ /* .seed_cur = */ seed_cur,
+ /* .tau = */ tau,
+ /* .eta = */ eta,
+ /* .m = */ m,
+ /* .mu = */ 2.0f*tau,
+ /* .rng = */ std::mt19937(seed_cur),
},
};
}
struct llama_sampler_mirostat_v2 {
const uint32_t seed;
+ uint32_t seed_cur;
const float tau;
const float eta;
static void llama_sampler_mirostat_v2_reset(struct llama_sampler * smpl) {
auto * ctx = (llama_sampler_mirostat_v2 *) smpl->ctx;
ctx->mu = 2.0f*ctx->tau;
- ctx->rng = std::mt19937(ctx->seed);
+ ctx->seed_cur = get_rng_seed(ctx->seed);
+ ctx->rng.seed(ctx->seed_cur);
}
static struct llama_sampler * llama_sampler_mirostat_v2_clone(const struct llama_sampler * smpl) {
};
struct llama_sampler * llama_sampler_init_mirostat_v2(uint32_t seed, float tau, float eta) {
+ auto seed_cur = get_rng_seed(seed);
return new llama_sampler {
/* .iface = */ &llama_sampler_mirostat_v2_i,
/* .ctx = */ new llama_sampler_mirostat_v2 {
- /* .seed = */ seed,
- /* .tau = */ tau,
- /* .eta = */ eta,
- /* .mu = */ 2.0f*tau,
- /* .rng = */ std::mt19937(seed),
+ /* .seed = */ seed,
+ /* .seed_cur = */ seed_cur,
+ /* .tau = */ tau,
+ /* .eta = */ eta,
+ /* .mu = */ 2.0f*tau,
+ /* .rng = */ std::mt19937(seed_cur),
},
};
}
ignore_eos = false;
}
+ penalty_last_n = std::max(penalty_last_n, 0);
+
return new llama_sampler {
/* .iface = */ &llama_sampler_penalties_i,
/* .ctx = */ new llama_sampler_penalties {
}
}
}
+
static struct llama_sampler * llama_sampler_logit_bias_clone(const struct llama_sampler * smpl) {
const auto * ctx = (const llama_sampler_logit_bias *) smpl->ctx;
return llama_sampler_init_logit_bias(ctx->n_vocab, ctx->logit_bias.size(), ctx->logit_bias.data());
},
};
}
+
+// utils
+
+uint32_t llama_sampler_get_seed(const struct llama_sampler * smpl) {
+ if (smpl->iface == &llama_sampler_dist_i) {
+ return ((const llama_sampler_dist *) smpl->ctx)->seed_cur;
+ }
+
+ if (smpl->iface == &llama_sampler_mirostat_i) {
+ return ((const llama_sampler_mirostat *) smpl->ctx)->seed_cur;
+ }
+
+ if (smpl->iface == &llama_sampler_mirostat_v2_i) {
+ return ((const llama_sampler_mirostat_v2 *) smpl->ctx)->seed_cur;
+ }
+
+ if (smpl->iface == &llama_sampler_chain_i) {
+ const auto * ctx = (const llama_sampler_chain *) smpl->ctx;
+ for (auto it = ctx->samplers.rbegin(); it != ctx->samplers.rend(); ++it) {
+ const uint32_t seed = llama_sampler_get_seed(*it);
+ if (seed != LLAMA_DEFAULT_SEED) {
+ return seed;
+ }
+ }
+ }
+
+ return LLAMA_DEFAULT_SEED;
+}