1094 The Largest Generation (25分)

本文介绍了一种通过深度优先搜索(DFS)算法遍历家族树结构的方法,旨在找出具有最多成员的一代及其具体代数。通过对输入数据进行解析,构建家族成员间的连接,算法能够有效地确定各代的人口数量,并最终输出人口最多的代数及其人口数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A family hierarchy is usually presented by a pedigree tree where all the nodes on the same level belong to the same generation. Your task is to find the generation with the largest population.

Input Specification:

Each input file contains one test case. Each case starts with two positive integers N (<100) which is the total number of family members in the tree (and hence assume that all the members are numbered from 01 to N), and M (<N) which is the number of family members who have children. Then M lines follow, each contains the information of a family member in the following format:

ID K ID[1] ID[2] ... ID[K]

where ID is a two-digit number representing a family member, K (>0) is the number of his/her children, followed by a sequence of two-digit ID's of his/her children. For the sake of simplicity, let us fix the root ID to be 01. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print in one line the largest population number and the level of the corresponding generation. It is assumed that such a generation is unique, and the root level is defined to be 1.

Sample Input:

23 13
21 1 23
01 4 03 02 04 05
03 3 06 07 08
06 2 12 13
13 1 21
08 2 15 16
02 2 09 10
11 2 19 20
17 1 22
05 1 11
07 1 14
09 1 17
10 1 18

Sample Output:

9 4

题意:建立一棵祖先树,每一层代表一代人,求最多那代人的人数和是哪一代人,根为第一代。

思路:用DFS遍历的同时使用height来保存第几代,并使用数组记录每代人数(下标为第几代),最后遍历数组,求出最大值并输出值和下标。

#include<iostream>

#include<vector>

using namespace std;
vector<int> vec[100];
bool visit[100] = {false};
int cnt_gen[100];
void dfs(int start, int height){

    cnt_gen[height]++;

    for(int i = 0; i < vec[start].size(); i++){

        if(!visit[vec[start][i]]){
            
            visit[vec[start][i]] = true;
            dfs(vec[start][i], height + 1);
        }
    }

}
int main(){

    int n, m;
    cin >> n >> m;

    for(int i = 0; i < m; i++){
        int id, k;
        scanf("%d %d", &id, &k);
        for(int j = 0; j < k; j++){
            int temp;
            scanf("%d", &temp);
            vec[id].push_back(temp);
        }

    }

    dfs(1, 1);
    int max_cnt = -1;
    int max_level = -1;
    for(int i = 1; i < 100; i++){
        if(cnt_gen[i] == 0){
            break;
        }
        if(max_cnt < cnt_gen[i]){
            max_cnt = cnt_gen[i];
            max_level = i;
        }
    }
    printf("%d %d\n", max_cnt, max_level);
    return 0;
}

 

import time import torch, torch_npu from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig # 替换成本地的模型权重路径 MODEL_PATH = "/models/z50051264/Qwen2.5-7B-Instruct" bnb_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_compute_dtype=torch.float16, # Support torch.float16, torch.float32, torch.bfloat16 bnb_4bit_quant_type="nf4", bnb_4bit_use_double_quant=False, bnb_4bit_quant_storage=torch.uint8 ) torch.npu.synchronize() start_time = time.time() model = AutoModelForCausalLM.from_pretrained( MODEL_PATH, device_map={"":0}, quantization_config=bnb_config, low_cpu_mem_usage=True, torch_dtype=torch.float16 # Support torch.float16, torch.float32, torch.bfloat16 ) torch.npu.synchronize() print(f"[+] load time: {time.time() - start_time:.6}s") tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH) model.eval() prompt = "Once upon a time, " inputs = tokenizer([prompt], return_tensors="pt") input_ids = inputs.input_ids.npu() attention_mask = inputs.attention_mask.npu() torch.npu.synchronize() start_time = time.time() generated_ids = model.generate( input_ids=input_ids, attention_mask=attention_mask, max_new_tokens=32, do_sample=False, ) torch.npu.synchronize() print(f"[+] inference time: {time.time() - start_time:.6}s") print(tokenizer.batch_decode(generated_ids)) 我在使用npu版本的bitsandbytes,但是执行以上代码,出现错误: [root@190f3c453709 inference]# python nf4.py /usr/local/python3.10.17/lib/python3.10/site-packages/torch_npu/utils/storage.py:38: UserWarning: TypedStorage is deprecated. It will be removed in the future and UntypedStorage will be the only storage class. This should only matter to you if you are using storages directly. To access UntypedStorage directly, use tensor.untyped_storage() instead of tensor.storage() if self.device.type != 'cpu': Loading checkpoint shards: 100%|█████████████████████████████████████████████████████████| 4/4 [00:13<00:00, 3.26s/it] [+] load time: 14.9728s The following generation flags are not valid and may be ignored: ['temperature', 'top_p', 'top_k']. Set `TRANSFORMERS_VERBOSITY=info` for more details. [+] inference time: 3.78472s ['Once upon a time, 123456789 was the largest known prime number. If a new prime number, 123456789'] 请析问题原因,并给出详细解决方法
最新发布
07-23
<think>我们面对的问题是在使用torch_npu和bitsandbytes加载NF4量化模型时,生成参数被忽略的问题。根据用户描述,问题可能出现在使用NPU版本的bitsandbytes时,模型加载过程中生成参数(如max_new_tokens等)被忽略,导致生成结果不符合预期。 ### 问题析 1. **环境配置**:使用torch_npu(适配昇腾NPU的PyTorch版本)和bitsandbytes(用于模型量化)来加载NF4量化模型。 2. **问题现象**:生成参数(如max_new_tokens)被忽略,导致生成文本时可能没有按照指定参数生成(例如生成长度不足或过长)。 3. **可能原因**: - bitsandbytes的NPU版本可能存在与标准CUDA版本的行为差异。 - 模型加载方式或量化配置不正确,导致生成参数无法正确传递。 - 当前版本的bitsandbytes_npu或torch_npu存在兼容性问题。 ### 解决方法 根据经验,我们可以尝试以下步骤: #### 1. **检查bitsandbytes_npu版本** 确保使用的bitsandbytes_npu是针对昇腾NPU适配的版本,并且与当前torch_npu版本兼容。可以尝试更新到最新版本。 #### 2. **检查模型加载代码** 在加载量化模型时,需要正确设置`load_in_4bit`和`bnb_4bit_compute_dtype`等参数。例如: ```python from transformers import AutoModelForCausalLM, BitsAndBytesConfig import torch quantization_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.float16, # 确保使用NPU支持的dtype,如float16 bnb_4bit_use_double_quant=False, ) model = AutoModelForCausalLM.from_pretrained( model_name_or_path, quantization_config=quantization_config, device_map="auto", # 或指定为"npu:0" torch_dtype=torch.float16 ) ``` #### 3. **显式传递生成参数** 在生成文本时,确保将生成参数(如`max_new_tokens`)显式传递给生成函数,并检查是否被正确使用: ```python inputs = tokenizer(prompt, return_tensors="pt").to("npu:0") outputs = model.generate(**inputs, max_new_tokens=50) ``` #### 4. **检查生成函数是否被重写** 某些模型可能重写了generate方法,导致参数被忽略。可以尝试使用基础模型的generate方法: ```python outputs = model.model.generate(**inputs, max_new_tokens=50) ``` #### 5. **使用最新版本的transformers库** 确保使用的transformers库是最新版本,因为其中可能修复了与bitsandbytes相关的问题。 #### 6. **检查NPU的bitsandbytes实现** 由于bitsandbytes原本是为CUDA设计,而NPU版本可能是由社区或厂商适配,可能存在一些未完全实现的功能。可以查看bitsandbytes_npu的源码,特别是生成相关的部,确认是否支持生成参数的传递。 ### 可能的问题根源 根据引用[2]中提到的模型合并和转换步骤,我们注意到在微调后进行了模型格式转换和合并。如果问题出现在微调后的模型上,那么可能是以下原因: - 模型合并过程中量化信息丢失。 - 微调后的模型结构发生变化,导致生成参数无法正确应用。 ### 解决方案验证 如果上述步骤不能解决问题,可以尝试以下方法: 1. **在标准CUDA环境下测试**:如果条件允许,在CUDA环境下使用相同的模型和bitsandbytes版本进行测试,以确定是否为NPU适配问题。 2. **简化模型**:使用一个未微调的原始模型(如InternLM2-chat-1.8B)进行NF4量化加载和生成,看是否出现同样问题。 3. **查看日志和错误信息**:检查是否有相关的警告或错误信息,这些信息可能有助于定位问题。 ### 总结 该问题可能是由于bitsandbytes在NPU上的适配不完全导致生成参数传递失败。建议优先尝试更新库版本,并检查模型加载和生成代码。如果问题仍然存在,可能需要等待bitsandbytes_npu的更新或向昇腾社区反馈该问题。 §§相关问题§§ 1. 如何正确配置环境以在昇腾NPU上运行量化模型? 2. bitsandbytes量化模型在NPU上运行时还有哪些常见问题? 3. 如何对微调后的模型进行量化并部署到NPU设备上?</think>### 问题析:NPU版bitsandbytes加载NF4量化模型时参数忽略问题 当使用`torch_npu`和`bitsandbytes`加载NF4量化模型时出现生成参数被忽略的问题,主要原因是**NPU适配的bitsandbytes版本与标准CUDA版本存在兼容性差异**,导致量化模型加载时部配置未被正确解析。以下是具体原因和解决方案: --- ### 原因析 1. **量化配置传递失效** NPU版bitsandbytes在加载NF4量化模型时,可能未正确处理`BitsAndBytesConfig`中的参数(如`load_in_4bit=True`),导致模型未启用量化。 2. **设备映射错误** `device_map="auto"`可能无法正确识别NPU设备,需显式指定设备类型为`npu`。 3. **数据类型不匹配** NPU对`bnb_4bit_compute_dtype`的支持可能与CUDA不同,需使用NPU支持的精度(如`torch.float16`)。 4. **依赖库版本冲突** `transformers`、`accelerate`等库的版本与NPU环境不兼容。 --- ### 解决方案 #### 1. 显式指定NPU设备映射 ```python from transformers import AutoModelForCausalLM, BitsAndBytesConfig quant_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.float16, # NPU需使用float16 ) model = AutoModelForCausalLM.from_pretrained( model_path, quantization_config=quant_config, device_map={"": "npu:0"}, # 关键:显式映射到NPU torch_dtype=torch.float16 ) ``` #### 2. 验证量化是否生效 ```python print(model.model.layers[0].mlp.gate_proj.weight.dtype) # 应显示torch.uint8或torch.int8 print(model.model.layers[0].mlp.gate_proj.weight.quant_state) # 检查量化状态 ``` #### 3. 强制启用NPU后端(如必要) ```python import bitsandbytes as bnb # 强制使用NPU后端 bnb.nn.Linear4bit.backend = "NPU" # 或尝试"npu" ``` #### 4. 环境配置建议 ```bash # 推荐版本组合 pip install torch_npu==2.1.0 # 匹配NPU驱动版本 pip install bitsandbytes-npu==0.42.0 # NPU专用支 pip install transformers==4.40.0 accelerate==0.29.0 ``` #### 5. 替代方案:使用昇腾原生量化 若问题持续,改用昇腾工具链量化: ```bash # 使用昇腾ATC工具转换模型 atc --model=model.onnx \ --framework=5 \ --output=model_quant \ --precision_mode=force_fp16 \ --soc_version=Ascend910B # 按实际芯片修改 ``` --- ### 关键验证点 1. 检查`weight`属性是否包含`quant_state`(量化状态元数据) 2. 确认`bnb_4bit_compute_dtype`设置为`torch.float16` 3. 确保`device_map`显式包含`"npu:0"`映射 4. 测试推理时显式传递参数: ```python outputs = model.generate(input_ids, max_new_tokens=50) # 参数需显式传递 ``` > **注意**:当前NPU对NF4量化的支持仍在完善中,若遇顽固问题建议暂时使用FP16或INT8量化[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值