用python解决6147问题!!!

'''
任意给一个四位数(各位数不完全相同),各个位上的数可组成一个最大数和一个最小数,他们的差又能组成一个
最大数和最小数,直到某一步得到的差将会出现循环重复。
例:
3100-0013=3087
8730-0378=8352
8532-2358=6147
7641-1467=6147
'''

题目如上⬆️

前段时间有个朋友问了我这个问题,当时看到的第一眼就觉得头大,看到数学就懵逼,然后也没有帮他写出来,直到刚才,这哥们还在不断的为这个问题努力,我就想,我也试试吧,人家为了一个问题都可以这么努力,为什么我连尝试的勇气都没有,等到真的去写的时候发现,我能做到。可能实现的不算完美,但是我做到了!有时候面对一个困难,你不是无法克服,你只是觉得自己无法克服然后就退缩了。希望当你看到这段话的时候也勇敢一些,再次面对问题时多尝试几次真的不行了再说自己做不到!

能力有限只能做到手动查找一个四位数是否为6147数。希望大佬可以帮忙改进找出自动打印所有6147数的办法。

下面是代码⤵️

def max_num(num):
    '''
    将输入的数组合出最大数
    '''
    num_max = []        # 定义空列表便于sort排序
    num = str(num)       # 整型没有len方法,所以必须转为字符串类型
    if len(num) != 4:     # 输入数字不是四位数直接结束
        return False
    for i in num:            # 将输入的数的每一位循环取出,放入列表排序
        num_max.append(i)
    num_max.sort(reverse=True)  # 因为是取最大值,所以要reverse
    num = ''.join(num_max)     # 重新拼接为字符串
    return num


def min_num(num):
    '''
    将输入的数组合出最小数
    '''
    num_max = []        # 参考max_num里面的注释
    num = str(num)
    if len(num) != 4:
        return False
    for i in num:
        num_max.append(i)
    num_max.sort()
    num = ''.join(num_max)
    return num


while True:
    num = int(input('输入一个四位数  >>:'))  # 输入一个四位数,如果打印信息为6147,则该数为6147数,否则不是
    while True:
        res = int(max_num(num)) - int(min_num(num))
        if res == num:
            print(num)
            break
        else:
            num = res
            continue

 

<think>我们注意到用户提供的目录中没有GGUF文件,而是有一个pytorch_model.bin文件和多个sha256校验文件。这实际上是一个PyTorch格式的模型权重文件,而不是Ollama通常使用的GGUF格式。因此,我们不需要进行GGUF到PyTorch权重的转换,而是可以直接利用这个pytorch_model.bin文件。但是,HuggingFace模型标准格式不仅需要模型权重文件(pytorch_model.bin),还需要配置文件(config.json)和分词器文件(tokenizer.json,tokenizer_config.json等)。而用户提供的目录中只有权重文件和校验文件,缺少必要的配置文件和分词器文件。因此,转换步骤应该是:1.获取原始模型的配置文件和分词器文件。由于这个模型是deepseek-r1-14b,我们可以从HuggingFaceHub上下载对应的配置文件和分词器文件。2.将现有的pytorch_model.bin与下载的配置文件和分词器文件组合在一起,形成完整的HuggingFace格式模型。具体步骤如下:步骤1:下载原始模型的配置文件和分词器文件我们可以使用`from_pretrained`方法,但为了避免下载权重(因为我们已经有pytorch_model.bin),我们可以只下载配置和分词器。步骤2:将pytorch_model.bin放入一个目录,并将配置文件和分词器文件也放入同一个目录。步骤3:保存分词器。步骤4:验证模型是否能够加载。详细操作:1.创建一个新的目录,例如`converted_deepseek_r1`。2.将`/opt/ollama_models/deepseek-r1-14b/pytorch_model.bin`复制到`converted_deepseek_r1`目录下,并重命名为`pytorch_model.bin`(或者保留原名,因为HuggingFace默认读取这个文件名)。3.使用HuggingFace的API下载配置和分词器:```pythonfromtransformersimportAutoConfig,AutoTokenizermodel_name="deepseek-ai/deepseek-llm-r1-14b-base"#下载配置文件config=AutoConfig.from_pretrained(model_name)config.save_pretrained("converted_deepseek_r1")#下载分词器tokenizer=AutoTokenizer.from_pretrained(model_name)tokenizer.save_pretrained("converted_deepseek_r1")```4.现在,`converted_deepseek_r1`目录下应该包含:-config.json-pytorch_model.bin-tokenizer相关的文件(如tokenizer.json,tokenizer_config.json等)5.尝试加载模型:```pythonfromtransformersimportAutoModelForCausalLMmodel=AutoModelForCausalLM.from_pretrained("converted_deepseek_r1")```注意:由于我们使用的是原始的配置文件,它期望的模型结构应该与我们的权重文件一致。但是,如果Ollama的权重格式与HuggingFace的权重格式有差异(比如层命名不同),则可能需要调整权重文件的键名。不过,根据Ollama的文档,其PyTorch格式的权重通常与HuggingFace兼容。如果出现权重名称不匹配,我们可以通过重命名权重字典中的键来适配。但首先,我们假设它们是兼容的。另外,用户目录中的多个sha256文件可能是用于校验的,我们可以忽略它们,或者将其中包含模型文件哈希值的那个用于验证我们的pytorch_model.bin是否与原始模型一致(可选)。如果遇到内存不足的问题,可以使用`torch_dtype=torch.float16`来加载为半精度。步骤5(可选):验证模型输出。由于用户提到缺少GGUF文件,所以之前的转换步骤(GGUF转PyTorch)是不必要的。我们直接利用已有的PyTorch权重。关于引用[1]中提到的`save_pretrained_merged`方法,这是否是一个自定义方法?在标准的transformers库中,我们使用`save_pretrained`来保存模型。因此,我们按照标准步骤保存即可。关于引用[2]中的镜像,如果用户需要在Docker环境中运行转换,可以使用该镜像,但本转换过程只需要Python环境和transformers库,因此用户可以在任何满足条件的环境中执行。因此,总结如下:操作步骤:1.创建输出目录。2.复制权重文件到输出目录。3.下载配置和分词器到同一目录。4.尝试加载模型。如果加载失败,可能需要检查权重文件是否与模型结构匹配(例如,检查权重文件的键名是否与配置匹配)。如果不匹配,则需要调整权重文件的键名。由于deepseek-r1-14b是一个已知的模型,我们假设Ollama提供的PyTorch权重与HuggingFace格式兼容。下面给出完整的代码示例:```bash#创建输出目录mkdir-pconverted_deepseek_r1#复制权重文件cp/opt/ollama_models/deepseek-r1-14b/pytorch_model.binconverted_deepseek_r1/pytorch_model.bin```然后运行Python脚本:```pythonfromtransformersimportAutoConfig,AutoTokenizer,AutoModelForCausalLM#设置模型名称和输出路径model_repo_id="deepseek-ai/deepseek-llm-r1-14b-base"output_dir="converted_deepseek_r1"#下载并保存配置config=AutoConfig.from_pretrained(model_repo_id)config.save_pretrained(output_dir)#下载并保存分词器tokenizer=AutoTokenizer.from_pretrained(model_repo_id)tokenizer.save_pretrained(output_dir)#尝试加载模型(注意:如果显存不足,可以加上torch_dtype=torch.float16)try:model=AutoModelForCausalLM.from_pretrained(output_dir)print("模型加载成功!")exceptExceptionase:print(f"模型加载失败:{e}")#如果失败,可能需要检查权重文件的结构```如果加载失败,我们可以打印权重文件的键名并与HuggingFace模型的键名进行比较:```pythonimporttorch#加载我们复制的权重state_dict=torch.load("converted_deepseek_r1/pytorch_model.bin",map_location="cpu")print("权重文件中的键:",state_dict.keys())#加载原始模型(不加载权重)的结构fromtransformersimportAutoModelForCausalLMmodel=AutoModelForCausalLM.from_pretrained(model_repo_id,state_dict=[])print("模型结构中的键:",model.state_dict().keys())```如果键名不一致,我们需要进行映射转换。但这种情况较为少见,如果出现,需要根据具体差异编写转换脚本。由于deepseek-r1-14b是较新的模型,且Ollama应该直接使用了HuggingFace的格式,所以大概率可以直接使用。因此,用户应该能够通过上述步骤完成转换。注意:如果原始模型是分片存储的(多个pytorch_model-*.bin),那么我们的单个pytorch_model.bin可能是合并的,这没有问题。最后,我们保存的目录就是标准的HuggingFace模型目录,可以直接使用`from_pretrained`加载。生成的相关问题:1.如果权重文件与HuggingFace模型结构不匹配,如何调整?2.如何验证转换后的模型与原始Ollama模型输出一致?3.转换后的模型如何量化为4-bit以在资源有限的设备上运行?4.在转换过程中出现磁盘空间不足的问题如何解决?5.如何将转换后的模型上传到HuggingFaceHub?</think>### 将 Ollama 模型转换为 Hugging Face 标准格式 根据您提供的目录结构,您的模型已经是 PyTorch 格式(包含 `pytorch_model.bin`),但缺少 Hugging Face 所需的配置文件。以下是完整转换步骤: --- ### 转换步骤(无需 GGUF 文件) #### 1. **创建标准目录结构** ```bash mkdir -p deepseek-r1-14b-hf && \ cd deepseek-r1-14b-hf && \ cp /opt/ollama_models/deepseek-r1-14b/pytorch_model.bin ./ ``` #### 2. **获取 Hugging Face 配置文件** ```python from transformers import AutoConfig, AutoTokenizer # 下载原始模型配置 (参考 deepseek-ai/deepseek-llm-r1-14b-base) config = AutoConfig.from_pretrained("deepseek-ai/deepseek-llm-r1-14b-base") config.save_pretrained(".") # 下载分词器 tokenizer = AutoTokenizer.from_pretrained("deepseek-ai/deepseek-llm-r1-14b-base") tokenizer.save_pretrained(".") ``` #### 3. **验证文件结构** 转换后目录应包含: ``` deepseek-r1-14b-hf/ ├── pytorch_model.bin # 原始模型权重 ├── config.json # 模型配置文件 ├── tokenizer_config.json # 分词器配置 ├── special_tokens_map.json ├── tokenizer.json # 分词器实现 └── (可能还有其他分词器文件) ``` #### 4. **加载验证模型** ```python from transformers import AutoModelForCausalLM model = AutoModelForCausalLM.from_pretrained( "./deepseek-r1-14b-hf", trust_remote_code=True, torch_dtype="auto" # 自动选择 float16/fp32 ) print(model) # 应显示 Deepseek 14B 架构 ``` --- ### 关键说明 1. **缺失 GGUF 的处理** 您的目录已包含原始 PyTorch 权重 (`pytorch_model.bin`),**无需 GGUF 转换**。Ollama 可能使用了 Hugging Face 兼容的格式[^3]。 2. **配置文件来源** 使用官方仓库配置: ```python config = AutoConfig.from_pretrained( "deepseek-ai/deepseek-llm-r1-14b-base", trust_remote_code=True ) ``` 3. **Docker 环境使用** 如需容器化操作(参考引用[2]): ```bash docker run -it --gpus all \ -v /opt/ollama_models:/models \ -v $(pwd):/output \ pytorch/pytorch:2.3.0-cuda12.1-cudnn8-runtime \ python -c "from transformers import AutoConfig; AutoConfig.from_pretrained('deepseek-ai/deepseek-llm-r1-14b-base').save_pretrained('/output')" ``` 4. **校验文件处理** SHA256 文件可忽略,它们用于 Ollama 的完整性验证,不影响 Hugging Face 加载。 --- ### 常见问题解决方案 | 问题类型 | 解决方案 | |---------|----------| | `KeyError` 加载错误 | 添加 `trust_remote_code=True` 参数[^3] | | 显存不足 | 添加 `device_map="auto"` 参数自动分片 | | 配置不匹配 | 检查 `config.json` 中的 `model_type` 应为 `deepseek` | | 分词器错误 | 确保复制所有 `tokenizer*` 文件 | > **重要提示**:14B 模型加载需至少 28GB RAM,建议在 GPU 环境操作。转换后可使用 `model.push_to_hub("your-username/deepseek-r1-14b")` 上传至 Hugging Face Hub。 --- ### 相关问题 1. 如何验证转换后的模型与原始 Ollama 模型输出的一致性? 2. 转换后的模型如何在消费级 GPU(如 RTX 4090)上高效运行? 3. 如何将 Hugging Face 格式的模型重新转换为 Ollama 支持的 GGUF 格式? 4. 当原始模型架构未知时,如何推断 Hugging Face 配置文件? 5. 如何处理转换后出现的 `Unexpected key(s) in state_dict` 警告?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Noah Ren

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值