mllm icon indicating copy to clipboard operation
mllm copied to clipboard

请问我想使用demo_llama3推理llama-3.1-8b模型需要增加哪些内容

Open yangyyj opened this issue 5 months ago • 14 comments

我在configuration中增加了8B的选项,然后运行./demo_llama3 对llama-3.1-8b进行推理时仍然会出现错误 输出如下

Image 部分问题输出的是乱码,部分问题能够正常进行回答

请问还需要对哪些部分进行修改吗 我初步排查不是量化的问题,因为我使用fp32未量化的模型进行推理同样会出现上述错误

yangyyj avatar Jul 06 '25 11:07 yangyyj

请问您是在什么设备上运行的?是x86还是arm架构?

chenghuaWang avatar Jul 07 '25 06:07 chenghuaWang

上述内容是我在x86架构服务器上运行的结果(bin目录下的demo_llama3) 我又测试了在手机端arm架构运行情况(bin-arm目录下的demo_llama3),结果如下: Image 情况似乎更加糟糕

yangyyj avatar Jul 07 '25 08:07 yangyyj

cc @yirongjie @XieWeikai

chenghuaWang avatar Jul 07 '25 08:07 chenghuaWang

以下是我增加的的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;
}

yangyyj avatar Jul 07 '25 09:07 yangyyj

您用的是 https://huggingface.co/meta-llama/Llama-3.1-8B-Instruct 这个模型吗?您是怎么得到mllm模型的?

XieWeikai avatar Jul 07 '25 11:07 XieWeikai

您用的是 https://huggingface.co/meta-llama/Llama-3.1-8B-Instruct 这个模型吗?您是怎么得到mllm模型的? 是的,我使用该模型,模型文件如下: Image 然后我通过下面代码得到fp32的mllm格式文件,如下 Image 然后使用如下代码量化为Q4K格式 Image 我使用fp32与量化后的文件进行推理均会出现上述问题

yangyyj avatar Jul 07 '25 12:07 yangyyj

cc @XieWeikai

chenghuaWang avatar Jul 22 '25 13:07 chenghuaWang

想请问一下你们有发现是什么原因造成的吗,如果修改起来太过麻烦,可以告诉我原因就好,我自己来进行改正,感谢你们

yangyyj avatar Aug 13 '25 08:08 yangyyj

您好,我最近空闲时尝试复现一下您遇到的问题,有结果了我再给您回复

XieWeikai avatar Aug 14 '25 08:08 XieWeikai

我尝试复现了一下,在x86上使用fp32进行推理并没有碰到同样的错误,我操作的步骤为:

  1. 我从 https://huggingface.co/meta-llama/Llama-3.1-8B-Instruct 下载了Llama3.1-8B的模型
  2. 在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
  1. 修改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")}};
        }
...
  1. 修改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

执行结果如下图

Image

XieWeikai avatar Aug 18 '25 09:08 XieWeikai

十分感谢您的回答,方便请问一下您转换出的模型fp32格式的大小吗 下面是我转换出的模型的大小

Image

yangyyj avatar Aug 18 '25 12:08 yangyyj

和您这个大小一样,30G

XieWeikai avatar Aug 18 '25 13:08 XieWeikai

您是meta官方的原始模型吗?

XieWeikai avatar Aug 18 '25 13:08 XieWeikai

感谢您的耐心回答,我重新拉取最新代码,整个项目重新编译后再次尝试可以成功推理了(虽然还是没搞清楚为什么前面推理会出现上述问题)

yangyyj avatar Aug 19 '25 07:08 yangyyj