请问我想使用demo_llama3推理llama-3.1-8b模型需要增加哪些内容
我在configuration中增加了8B的选项,然后运行./demo_llama3 对llama-3.1-8b进行推理时仍然会出现错误 输出如下
请问还需要对哪些部分进行修改吗 我初步排查不是量化的问题,因为我使用fp32未量化的模型进行推理同样会出现上述错误
请问您是在什么设备上运行的?是x86还是arm架构?
上述内容是我在x86架构服务器上运行的结果(bin目录下的demo_llama3)
我又测试了在手机端arm架构运行情况(bin-arm目录下的demo_llama3),结果如下:
情况似乎更加糟糕
cc @yirongjie @XieWeikai
以下是我增加的的configuration部分:
else if (billions == "8B" || billions == "8b"){
vocab_size = 128256;
hidden_dim = 4096;
head_size = 32;
num_key_value_heads = 8;
ffn_hidden = 14336;
block_num = 32;
max_position_embeddings = 131072;
rope_theta = 500000.0;
tie_word_embeddings = false;
rope_scaling = {
{"factor", 8.0f},
{"high_freq_factor", 4.0f},
{"low_freq_factor", 1.0f},
{"original_max_position_embeddings", 8192},
{"rope_type", std::string("llama3")}};
}
以下是我的推理代码: 我尝试了原始推理方法,同时增加了使用model.generate的推理方法,都会出现同样的问题
int main(int argc, char **argv) {
cmdline::parser cmdParser;
cmdParser.add<string>("vocab", 'v', "specify mllm tokenizer model path", false, "../vocab/llama3_tokenizer.model");
cmdParser.add<string>("model", 'm', "specify mllm model path", false, "../models/llama-3.1-8b-instruct_q4_k.mllm");
cmdParser.add<string>("billion", 'b', "[1B | 3B | 8B]", false, "8B");
cmdParser.add<int>("limits", 'l', "max KV cache size", false, 400);
cmdParser.add<int>("thread", 't', "num of threads", false, 4);
cmdParser.parse_check(argc, argv);
string vocab_path = cmdParser.get<string>("vocab");
string model_path = cmdParser.get<string>("model");
string model_billion = cmdParser.get<string>("billion");
int tokens_limit = cmdParser.get<int>("limits");
CPUBackend::cpu_threads = cmdParser.get<int>("thread");
Llama3Config config(400, model_billion);
auto tokenizer = LLama3Tokenizer(vocab_path);
config.cache_limit = tokens_limit;
auto model = Llama3Model(config);
model.load(model_path);
vector<string> in_strs = {
"Hello, who are you?",
"What can you do?",
"Please introduce Beijing University of Posts and Telecommunications."};
//原本的推理代码
for (int i = 0; i < in_strs.size(); ++i) {
auto in_str = tokenizer.apply_chat_template(in_strs[i]);
auto input_tensor = tokenizer.tokenize(in_str);
std::cout << "[Q] " << in_strs[i] << std::endl;
std::cout << "[A] " << std::flush;
for (int step = 0; step < 100; step++) {
auto result = model({input_tensor});
auto [out_string, out_token] = tokenizer.detokenize(result[0]);
auto [not_end, output_string] = tokenizer.postprocess(out_string);
if (!not_end) { break; }
std::cout << output_string << std::flush;
chatPostProcessing(out_token, input_tensor, {});
}
printf("\n");
model.clear_kvcache();
model.profiling();
}
//使用model.generate 进行推理
for (int i = 0; i < in_strs.size(); ++i) {
auto input_str = tokenizer.apply_chat_template(in_strs[i]);
auto input_tensor = tokenizer.tokenize(input_str);
std::cout << "[Q] " << in_strs[i] << std::endl;
std::cout << "[A] " << std::flush;
LlmTextGeneratorOpts opt{
.max_new_tokens = 100,
.do_sample = true,
.temperature = 0.3F,
.top_k = 50,
.top_p = 0.F,
};
model.generate(input_tensor, opt, [&](unsigned int out_token) -> bool {
auto out_string = tokenizer.detokenize({out_token});
auto [not_end, output_string] = tokenizer.postprocess(out_string);
if (!not_end) { return false; }
std::cout << output_string << std::flush;
return true;
});
std::cout << "\n";
model.clear_kvcache();
model.profiling();
}
return 0;
}
您用的是 https://huggingface.co/meta-llama/Llama-3.1-8B-Instruct 这个模型吗?您是怎么得到mllm模型的?
您用的是 https://huggingface.co/meta-llama/Llama-3.1-8B-Instruct 这个模型吗?您是怎么得到mllm模型的? 是的,我使用该模型,模型文件如下:
然后我通过下面代码得到fp32的mllm格式文件,如下
然后使用如下代码量化为Q4K格式
我使用fp32与量化后的文件进行推理均会出现上述问题
cc @XieWeikai
想请问一下你们有发现是什么原因造成的吗,如果修改起来太过麻烦,可以告诉我原因就好,我自己来进行改正,感谢你们
您好,我最近空闲时尝试复现一下您遇到的问题,有结果了我再给您回复
我尝试复现了一下,在x86上使用fp32进行推理并没有碰到同样的错误,我操作的步骤为:
- 我从 https://huggingface.co/meta-llama/Llama-3.1-8B-Instruct 下载了Llama3.1-8B的模型
- 在mllm根目录下执行如下命令生成mllm模型
mkdir mllm_models
python tools/convertor/converter.py --input_model path/to/Llama-3.1-8B-Instruct/model.safetensors.index.json --output_model mllm_models/Llama-3.1-8B-Instruct-fp32.mllm --type safetensor
- 修改mllm/src/models/llama3/configuration_llama3.hpp,添加如下部分
...
else if (billions == "8B" || billions == "8b") { // Llama3.1-8B
vocab_size = 128256;
hidden_dim = 4096;
head_size = 32;
num_key_value_heads = 8;
ffn_hidden = 14336;
block_num = 32;
max_position_embeddings = 131072;
rope_theta = 500000.0;
tie_word_embeddings = false;
rope_scaling = {
{"factor", 8.0f},
{"high_freq_factor", 4.0f},
{"low_freq_factor", 1.0f},
{"original_max_position_embeddings", 8192},
{"rope_type", std::string("llama3")}};
}
...
- 修改demo_llama3中的prompt和您图片中一致,其他的保持不变,编译后执行如下命令
./bin/demo_llama3 -v vocab/llama3_tokenizer.model -m mllm_models/Llama-3.1-8B-Instruct-fp32.mllm -b 8B -t 128
执行结果如下图
十分感谢您的回答,方便请问一下您转换出的模型fp32格式的大小吗 下面是我转换出的模型的大小
和您这个大小一样,30G
您是meta官方的原始模型吗?
感谢您的耐心回答,我重新拉取最新代码,整个项目重新编译后再次尝试可以成功推理了(虽然还是没搞清楚为什么前面推理会出现上述问题)