【Hugging Face】编写 shell 脚本在 huggingface 镜像站快速下载模型文件

发布于:2024-05-08 ⋅ 阅读:(23) ⋅ 点赞:(0)

前言

我们使用 Git LFS 和 wget 结合的方法,小文件使用 Git 下载,大文件使用 wget 下载

Git 下载的优缺点:

优点:相当简单

缺点:不支持断点续传

直接 wegt 下载比较稳定,但是欠缺优雅

我们可以将这两种方法进行结合

下载教程

模型选择上,我这里选择的模型为镜像站上的 gradientai/Llama-3-8B-Instruct-262k · HF Mirror

大家也可以自行选择想要的模型

首先下载模型文件中较小的那些部分(跳过使用 GIT LFS 的大文件)

GIT_LFS_SKIP_SMUDGE=1 git clone https://hf-mirror.com/gradientai/Llama-3-8B-Instruct-262k

输出如下,成功下载了这些部分,速度很快

点击任意一个模型文件,里面的内容是类似这样的东西:

version https://git-lfs.github.com/spec/v1
oid sha256:7432c5d8273697c39adbb717988938009d9391e1224403495afbbaaa5cea401c
size 4999802720

这不是模型文件,而是一个类似于指针的东西,用于后续使用 GIT LFS 拉取下载,我们将这几个统统删除。

编写 shell 脚本文件来下载模型部分

大家可以直接用我这个脚本,两个命令行参数代表模型名称和总文件个数

#!/bin/bash

# 检查是否提供了正确数量的参数
if [ "$#" -ne 2 ]; then
    echo "Usage: $0 <model_name> <total_models>"
    exit 1
fi

# 解析命令行参数
model_name="$1"
total_models="$2"

# 循环下载每个模型文件
for ((i=1; i<=$total_models; i++)); do
    # 构建文件名
    model_file="$(printf "%s/resolve/main/model-%05d-of-%05d.safetensors" "$model_name" "$i" "$total_models")"
    
    # 构建下载链接
    download_link="<https://hf-mirror.com/$model_file>"
    
    # 启动下载任务
    wget -b "$download_link" -O "$(basename "$model_file")"
done

echo "Downloads started in background."

将文件放在和模型同级的目录下(重要),然后启动该脚本

cd Llama-3-8B-Instruct-262k/
bash download_model.sh gradientai/Llama-3-8B-Instruct-262k 4

输出如下:

可以看到目录里面多了这些文件,此时模型已经在下载了,而且是同时下载

速度还是很快的,而且几乎是同时下载:

这是其中一个日志文件的结尾,由于这四个文件是同时下载的,所以五六分钟,模型就下载好了。

4859800K .......... .......... .......... .......... .......... 99% 19.3M 0s
4859850K .......... .......... .......... .......... .......... 99% 18.1M 0s
4859900K .......... .......... .......... .......... .......... 99% 23.1M 0s
4859950K .......... .......... .......... .......... .......... 99% 30.9M 0s
4860000K .......... .......... .......... .......... .......... 99% 19.6M 0s
4860050K .......                                               100% 22.7M=4m58s

2024-05-07 17:15:26 (15.9 MB/s) - ‘model-00001-of-00004.safetensors’ saved [4976698672/4976698672]

我们编写代码,用下这个模型试试:

import transformers
import torch

model_id = "/root/autodl-tmp/models/Llama-3-8B-Instruct-262k"

pipeline = transformers.pipeline(
    "text-generation",
    model=model_id,
    model_kwargs={"torch_dtype": torch.bfloat16},
    device_map="auto",
)

messages = [
    {"role": "system", "content": "You are a pirate chatbot who always responds in pirate speak!"},
    {"role": "user", "content": "Who are you?"},
]

prompt = pipeline.tokenizer.apply_chat_template(
        messages, 
        tokenize=False, 
        add_generation_prompt=True
)

terminators = [
    pipeline.tokenizer.eos_token_id,
    pipeline.tokenizer.convert_tokens_to_ids("<|eot_id|>")
]

outputs = pipeline(
    prompt,
    max_new_tokens=256,
    eos_token_id=terminators,
    do_sample=True,
    temperature=0.6,
    top_p=0.9,
)
print(outputs[0]["generated_text"][len(prompt):])

模型输出如下,没啥子问题: