LLaMA Factory: Easy and Efficient LLM Fine-Tuning

安装

  • pip
git clone https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory

python -m venv env
source env/bin/activate

pip install -e .[metrics]
  • conda
git clone https://github.com/hiyouga/LLaMA-Factory.git

conda create -n llama_factory python=3.10
conda activate llama_factory

cd LLaMA-Factory
pip install -r requirements.txt

使用 conda 第二次没有安装成功

使用

LLaMA Board

本地启动

CUDA_VISIBLE_DEVICES=0 USE_MODELSCOPE_HUB=1 python src/train_web.py
  • CUDA_VISIBLE_DEVICES=0: 指定 GPU
  • USE_MODELSCOPE_HUB=1: 使用魔搭社区的模型和数据集下载

浏览器访问

http://localhost:7860

微调模型

聊天

vLLM 部署 Qwen1.5 LLM

安装 vLLM

# (Optional) Create a new conda environment.
conda create -n vllm python=3.9 -y
conda activate vllm

# Install vLLM with CUDA 12.1.
pip install vllm

vLLM 帮助 vLLM 兼容 OpenAI 的 RESTful API 服务器。 可选参数: -h, --help 显示此帮助信息并退出 --host HOST 主机名 --port PORT 端口号 --allow-credentials 允许凭证 --allowed-origins ALLOWED_ORIGINS 允许的来源 --allowed-methods ALLOWED_METHODS 允许的方法 --allowed-headers ALLOWED_HEADERS 允许的头部 --api-key API_KEY 如果提供,服务器将要求在头部中呈现此密钥。 --served-model-name SERVED_MODEL_NAME 在API中使用的模型名称。如果没有指定,模型名称将与huggingface名称相同。 --lora-modules LORA_MODULES [LORA_MODULES ...] LoRA模块配置,格式为名称=路径。可以指定多个模块。

MLX: An array framework for Apple silicon

MLX 介绍

MLX 是一个为 Apple Silicon 芯片上的机器学习研究设计的 array 框架,由 Apple 机器学习研究团队提供。

  • 熟悉的 API:MLX 拥有一个与 NumPy 紧密对应的 Python API。MLX 还拥有功能齐全的 C++、C 和 Swift API,这些 API 也紧密地反映了 Python API。MLX 拥有更高级别的包,如 mlx.nn 和 mlx.optimizers,它们的 API 紧密跟随 PyTorch,以简化构建更复杂模型的过程。
  • 统一内存:MLX 与其他框架的一个显著区别在于其统一内存模型。MLX 中的数组存在于共享内存中。可以在任何支持的设备类型上执行 MLX 数组的操作,无需数据传输。
  • MLX 的设计受到了像 NumPyPyTorchJaxArrayFire 这样的框架的启发。

安装

  • pip
pip install mlx
pip install mlx-lm
  • conda
conda install -c conda-forge mlx
conda install -c conda-forge mlx-lm

生成式AI

机器学习的方法

监督学习(Supervised Learning)

监督学习使用带有标签的训练数据来训练模型。这些标签是预先定义的输出,模型通过学习输入数据与这些输出之间的关系来进行预测。监督学习的任务通常分为两类:分类(预测离散的标签)和回归(预测连续的数值)。常见的监督学习算法包括决策树、逻辑回归、支持向量机(SVM)、神经网络等。监督学习广泛应用于图像识别、语音识别、医疗诊断等领域。

无监督学习(Unsupervised Learning)

无监督学习不依赖于标签数据,而是试图在没有明确指导的情况下发现数据中的结构和模式。它的主要任务包括聚类(将数据分组到不同的簇中)和降维(减少数据的复杂性,同时保留其主要特征)。无监督学习常用于市场细分、社交网络分析、异常检测等场景。算法示例包括K-means聚类、主成分分析(PCA)等。

自监督学习(Self-Supervised Learning)

自监督学习是一种无监督学习的形式,它通过从数据本身生成伪标签来创建监督信号。这种方法通常涉及到设计任务,使得模型能够从数据中学习有用的特征表示,而不需要人工标注。自监督学习在计算机视觉和自然语言处理中尤其流行,例如,通过预测图像的旋转角度或文本的下一个字来训练模型。这种方法有助于减少对大量标注数据的依赖,同时为下游任务提供预训练的模型。

生成式AI(Generative AI) 生成式AI的目标是

Rust 入门

Rust 安装

macOS

  • 安装 rustup,它是 Rust 的版本管理工具。
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sudo sh

这里加了 sudo 是因为修改配置文件需要权限。

Rustup 元数据和工具链将安装到 Rustup 的主目录,位于:~/.rustup,这可以使用 RUSTUP_HOME 环境变量进行修改。

Cargo 主目录位于:~/.cargo,这可以使用 CARGO_HOME 环境变量进行修改。

cargo、rustc、rustup 等命令安装到 Cargo 的 bin 目录,位于:~/.cargo/bin

  • 更新 Rust
sudo rustup update
  • 卸载 Rust
sudo rustup self uninstall
  • 查看版本
$ cargo --version
cargo 1.76.0 (c84b36747 2024-01-18)
$ rust rustc --version
rustc 1.76.0 (07dca489a 2024-02-04)
$ rust rustdoc --version
rustdoc 1.76.0 (07dca489a 2024-02-04)

cargo 是 Rust 的构建工具,类似于 npm、pip、go 等。

Kimi(月之暗面)简历的探索

这里使用了 Kimi 月之暗面 对简历这个场景进行了探索,Kimi 支持 128k 的长上下文,超过20万个汉字。

通过简历评估一下这位算法工程师的能力。

上传简历

根据李秀宁的简历,我们可以对她的技能和经验进行以下评估:

1. 编程技能:

她掌握多种编程语言,包括MATLAB、C、C++、Python,这些都是算法开发中常用的语言。
熟练使用多个开发平台,如MATLAB、Visual Studio、Eclipse、Qt、CCS、Pycharm,这表明她具备跨平台开发的能力。
熟悉OpenCV、yolov 5等图像处理库,这些是计算机视觉领域的重要工具。

2. 专业知识:

她掌握了多种信号处理方法,如快速傅里叶变换、短时傅里叶变换、数字滤波器设计等,这些都是信号处理和图像处理领域的基础。
熟悉深度学习框架,如tensorflow、keras、Pytorch,这些是当前人工智能和机器学习领域的主流工具。

3. 工作经验:

// ...

我们需要一位NLP工程师,专注能大模型的应用,她能够胜任? 根据李秀宁的简历,她在图像处理和信号处理方面有丰富的经验和专业知识,但在自然语言处理(NLP)和大模型应用方面的经验并不明显。简历中没有提到她有直接从事NLP项目或使用大模型(如BERT、GPT等)的经验。 NLP工程师通常需要具备以下技能和经验: 1.

DeepSeek-Coder 论文解读

论文

模型的性能

多语言基准性能

训练数据集

数据来源:2023年2月之前在GitHub上创建的公共仓库。

数据集创建过程

  1. GitHub数据抓取
  2. 规则过滤
  3. 依存分析
  4. 仓库级重复数据删除
  5. 质量筛选

规则过滤 过滤掉平均行长度超过100个字符或最大行长度超过1000个字符的文件。 移除了字母字符少于25%的文件。 除了XSLT编程语言外,过滤掉在前100个字符中出现字符串 "<?xml_version=" 的文件。 对于HTML文件,考虑可见文本与HTML代码的比例,保留可见文本占代码至少20%且不少于100个字符的文件。 对于包含更多数据的JSON和YAML文件,只保留字符计数在50到5000个字符范围内的文件。

Hugging Face NLP Course

1. TRANSFORMER 模型

自然语言处理

NLP 是语言学和机器学习交叉领域,专注于理解与人类语言相关的一切。 NLP 任务的目标不仅是单独理解单个单词,而且是能够理解这些单词的上下文

以下是常见 NLP 任务的列表:

  • 对整个句子进行分类:
    • 获取评论的情绪
    • 检测电子邮件是否为垃圾邮件
    • 确定句子在语法上是否正确
    • 确定两个句子在逻辑上是否相关
  • 对句子中的每个词进行分类:
    • 识别句子的语法成分(名词、动词、形容词)
    • 识别句子的命名实体(人、地点、组织)
  • 生成文本内容:
    • 用自动生成的文本完成提示
    • 用屏蔽词填充文本中的空白
  • 从文本中提取答案:
    • 给定问题和上下文,根据上下文中提供的信息提取问题的答案
  • 从输入文本生成新句子:
    • 将文本翻译成另一种语言
    • 总结文本
  • 语音识别:
    • 生成音频样本的转录
  • 计算机视觉:
    • 生成图像描述
    • 目标检测

Transformers 能做什么?

Transformers 库中最基本的对象是 pipeline() 函数。它将模型与其必要的预处理和后处理步骤连接起来,使我们能够通过直接输入任何文本并获得最终的答案:

在 MLX 上使用 LoRA / QLoRA 微调 Text2SQL(七):MLX 微调的模型转换为 GGUF 模型

将 MLX 微调的模型转换为 GGUF 模型最大的意义是可以融入 GGUF 的生态系统,可以在更多的平台上使用。

LoRA 微调

大模型 Mistral-7B-v0.1

数据集 WikiSQL

修改脚本 mlx-examples/lora/data/wikisql.py

if __name__ == "__main__":
    # ......
    for dataset, name, size in datasets:
        with open(f"data/{name}.jsonl", "w") as fid:
            for e, t in zip(range(size), dataset):
                t = t[3:]
                json.dump({"text": t}, fid)
                fid.write("\n")

执行脚本 data/wikisql.py 生成数据集。

data/wikisql.py

安装 mlx-lm

pip install mlx-lm

微调

在 MLX 上使用 LoRA / QLoRA 微调 Text2SQL(六):使用 LoRA 基于 Deepseek-Coder-7B 微调

大模型 Deepseek-Coder-7B

数据集 WikiSQL

修改脚本 mlx-examples/lora/data/wikisql.py if name == "main": # ...... for dataset, name, size in datasets: with open(f"data/{name}.jsonl", "w") as fid: for e, t in zip(range(size), dataset): # deepseek-ai/deepseek-coder-7b-instruct-v1.5 # 去掉开头的 <|begin▁of▁sentence|>,因为 tokenizer 会自动添加 <|begin▁of▁sentence|> t = t[3:-4] + "<|end▁of▁sentence|>" json.dump({"text": t}, fid) fid.

在 MLX 上使用 LoRA / QLoRA 微调 Text2SQL(五):对比使用 LoRA 和 QLoRA 基于 Mistral-7B 微调的效果

使用 LoRA 和 QLoRA 基于 Mistral-7B 微调的实验

LoRA 和 QLoRA 对比

微调

Iteration LoRA Train Loss LoRA Val Loss LoRA Tokens/sec QLoRA Train Loss QLoRA Val Loss QLoRA Tokens/sec
1 2.343 2.420
100 1.204 221.348 1.216 166.377
200 1.091 1.111 207.353 1.095 1.130 187.795
300 0.818 234.182 1.065 194.826
400 0.837 1.076 207.763 0.998 1.006 170.072
500 0.774 223.036 0.726 189.288
600 0.609 1.001 218.118 0.607 1.015 186.397

微调的参数量 LoRA 微调万分之 2.35 (1.704M / 7243.436M * 10000)的模型参数。 QLoRA 微调万分之 13.

在 MLX 上使用 LoRA / QLoRA 微调 Text2SQL(四):使用 QLoRA 基于 Mistral-7B 微调

预训练模型 mistralai/Mistral-7B-v0.1

量化

QLoRA 微调需要量化,生成 4 位量化的 Mistral 7B 并默认将其存储在 mlx_model 目录中

python convert.py --hf-path mistralai/Mistral-7B-v0.1 -q

mlx_model 目录结构如下:

mlx_model
├── config.json
├── model.safetensors
├── special_tokens_map.json
├── tokenizer.json
├── tokenizer.model
├── tokenizer_config.json
└── weights.00.safetensors

量化后的模型 8.0G

微调

QLoRA 微调

在 MLX 上使用 LoRA / QLoRA 微调 Text2SQL(三):分享微调后的模型到 HuggingFace Hub

mlx-community/Mistral-7B-v0.1-LoRA-Text2SQL

安装 mlx-lm

pip install mlx-lm

生成 SQL

python -m mlx_lm.generate --model mlx-community/Mistral-7B-v0.1-LoRA-Text2SQL \
                          --max-tokens 50 \
                          --prompt "table: students
columns: Name, Age, School, Grade, Height, Weight
Q: Which school did Wang Junjian come from?
A: "
SELECT School FROM Students WHERE Name = 'Wang Junjian'

上传模型到 HuggingFace Hub

  1. 加入 MLX Community 组织
  1. 在 MLX Community 组织中创建一个新的模型 mlx-community/Mistral-7B-v0.1-LoRA-Text2SQL
  1. 克隆仓库 mlx-community/Mistral-7B-v0.1-LoRA-Text2SQL

在 MLX 上使用 LoRA / QLoRA 微调 Text2SQL(二):使用 LoRA 基于 Mistral-7B 微调

mlx-community/Mistral-7B-v0.1-LoRA-Text2SQL

本次微调的模型我已经上传到了 HuggingFace Hub 上,大家可以进行尝试。

安装 mlx-lm

pip install mlx-lm

生成 SQL

python -m mlx_lm.generate --model mlx-community/Mistral-7B-v0.1-LoRA-Text2SQL \
                          --max-tokens 50 \
                          --prompt "table: students
columns: Name, Age, School, Grade, Height, Weight
Q: Which school did Wang Junjian come from?
A: "
SELECT School FROM Students WHERE Name = 'Wang Junjian'

在 MLX 上使用 LoRA / QLoRA 微调 Text2SQL(一):使用 LoRA 基于 Mistral-7B 微调

📌 没有使用模型的标注格式生成数据集,导致不能结束,直到生成最大的 Tokens 数量。

这次我们来解决这个问题。

数据集 WikiSQL

修改脚本 mlx-examples/lora/data/w