首页 > 其他分享 >[个人理解] llama.cpp之sample策略

[个人理解] llama.cpp之sample策略

时间:2024-07-30 11:41:15浏览次数:8  
标签:min sample token dynatemp llama sampler cpp

最近有点时间看了几天llama.cpp 的code,有几个点,想记录一下,不对的地方,欢迎大家指正。

话说本该去年就看,奈何这个领域变的太快,索性积累到今年,当openAI也开始挤牙膏的时候一并看了。

Summary

- llama是跟chatpgt一样,基于transformer架构的decode only的一挂,这一系列的模型擅长文字接龙

- llama的模型几个部分,tokenalize, embedding, decode, sample

index module  function in llama.cpp
1 tokenize llama_tokenize
2 embedding  
3 decode llama_decode
4 sample llama_sampling_sample
     

这篇文章重点介绍sample这一块

 

sample 策略

总结起来就是,本来decode输出的是字典里面每个token是next token的概率,但是不能直接取概率最大的那一个,需要有一定的sample策略。基本上就是两步走,第一步,要先筛筛,把符合一定条件的token留下,第二步掷骰子,随机选取一个token。

先说这第一步

llama里面用的是多种策略的组合,核心的code是下面这几行。samplers_sequence里面基本上这几种策略都用了,先是top40,把概率排名前40的token留下,然后又是top p就是把概率大于p的都留下,然后是temperature的策略,把所有token的概率重新算一算,温度越高,那么所有的概率就越接近,温度越低,就让概率高的越高,概率低的越低,拉大差距,知道谁在裸泳。

for (auto sampler_type : samplers_sequence) {
    switch (sampler_type) {
        case llama_sampler_type::TOP_K    : llama_sample_top_k    (ctx_main, &cur_p, top_k,     min_keep); break;
        case llama_sampler_type::TFS_Z    : llama_sample_tail_free(ctx_main, &cur_p, tfs_z,     min_keep); break;
        case llama_sampler_type::TYPICAL_P: llama_sample_typical  (ctx_main, &cur_p, typical_p, min_keep); break;
        case llama_sampler_type::TOP_P    : llama_sample_top_p    (ctx_main, &cur_p, top_p,     min_keep); break;
        case llama_sampler_type::MIN_P    : llama_sample_min_p    (ctx_main, &cur_p, min_p,     min_keep); break;
        case llama_sampler_type::TEMPERATURE:
            if (dynatemp_range > 0) {
                float dynatemp_min = std::max(0.0f, temp - dynatemp_range);
                float dynatemp_max = std::max(0.0f, temp + dynatemp_range);
                llama_sample_entropy(ctx_main, &cur_p, dynatemp_min, dynatemp_max, dynatemp_exponent);
            } else {
                llama_sample_temp(ctx_main, &cur_p, temp);
            }
            break;
        default : break;
    }
}

  

再说第二步

这第二步也很简单,code里面核心部分就一行,就是根据每个token的概率值去归一化然后重新产生一组概率,这重新产生的概率和为1,然后根据这个概率分布去掷骰子,看看究竟选了哪个token的id。就结束了。

std::discrete_distribution<> dist(probs.begin(), probs.end());

  

差不多就是这样。

看到网上讲这一块的比较少,就记录一下。

标签:min,sample,token,dynatemp,llama,sampler,cpp
From: https://www.cnblogs.com/sunny-li/p/18332031

相关文章

  • Ollama+GGUF离线加载本地模型
    一般在使用Ollama下载模型时,都是从Ollama官方仓库下载(使用ollamarun命令),但一些环境下,受限于网速等原因使用这种方式可能会非常慢甚至无法下载,所以我们可以选择使用Huggingface上的GGUF文件,在Ollama仓库里的模型都可以在Huggingface上找到,因此我们可以使用Ollama+GGUF文件离线......
  • 无法在 Llama Index 中加载 HuggingFace Embeddings llama3.1
    我有一个非常简单的代码,如下所示:fromllama_index.embeddings.huggingfaceimportHuggingFaceEmbeddingembed_model=HuggingFaceEmbedding(model_name="meta-llama/Meta-Llama-3-8B")我看到这个模型,meta-llama/Meta-Llama-3-8B,只有4.5GB,而我有16GBRAM,最多只使用20......
  • 《史上最简单的SpringAI+Llama3.x教程》-05-打破界限,Function Calling在业务场景中的
    什么是FunctionCallingFunctionCalling是一种技术,它允许大型语言模型(如GPT)在生成文本的过程中调用外部函数或服务。这种功能的核心在于,模型本身不直接执行函数,而是生成包含函数名称和执行函数所需参数的JSON,然后由外部系统执行这些函数,并将结果返回给模型以完成对话或......
  • 【ollama】手把手教你布置本地大语言模型 以及各种常见用途#如何加载guff模型到ollama
    ollama介绍Ollama是一个开源框架,专为在本地机器上便捷部署和运行大型语言模型(LLM)而设计。以下是其主要特点和功能概述:简化部署:Ollama目标在于简化在Docker容器中部署大型语言模型的过程,使得非专业用户也能方便地管理和运行这些复杂的模型。轻量级与可扩展:作为轻量级......
  • 即刻体验 Llama3.1就在Amazon Bedrock!
    引言在人工智能的浪潮中,大型语言模型(LLMs)不断推动着技术边界的扩展。Meta最新推出的Llama3.1模型系列,以其卓越的性能和广泛的应用前景,引起了业界的广泛关注。现在,激动人心的消息来了——Llama3.1已经在AmazonBedrock上线,让开发者和研究人员能够即刻体验这一革命性技术......
  • Llama 3.1 重磅发布,登顶开源大模型王座!
     7月23日,Meta正式发布迄今为止最强大的开源模型——Llama3.1405B,同时发布了全新升级的Llama3.170B和8B模Meta在正式发布里也附上了长达92页的论文《TheLlama3HerdofModels》,揭示了Llama3模型的技术和训练细论文地址:https://ai.meta.com/research/publications/the......
  • 【科大讯飞笔试题汇总】2024-07-27-科大讯飞秋招提前批(研发岗)-三语言题解(Cpp/Java/
    ......
  • 本地运行Meta最新大模型:Llama3.1
    手把手教你本地运行Meta最新大模型:Llama3.1,可是它说自己是ChatGPT? 就在昨晚,Meta发布了可以与OpenAI掰手腕的最新开源大模型:Llama3.1。该模型共有三个版本:8B70B405B对于这次发布,Meta已经在超过150个涵盖广泛语言范围的基准数据集上评估了性能。此外,Meta还进行了广泛......
  • 解决LLaMA-Factory共享链接的创建问题--[To create a public link, set `share=True`
    问题引入LLaMA-Factory是一种简单有效的LLM微调工具。其所开发的由gradio驱动的webui更是提供了可视化微调,降低了微调大模型的门槛。然而,在使用llamafactory-cliwebui来创建可视化微调模块时,只能得到本地的网页链接:这种方法限制了webui模块在服务器或者autodl等租赁网站......
  • 智谱GLM Api接口适配langchain OpenAI llamaindex的openAI接口
    动机OpenAI充值比较麻烦,且访问不是那么方便。因此想用国内的api的去调试和测试一个任务。但是很多教程都是以openAI的接口为例子的,因此学习起来就不那么方便。本文参考了hugggingface中迁移OpenAI的博客,chatGLMcookbook关于接口的迁移文档,llamindexOpenAIlike的示例,终于调......