使用peft进行Fine Tuning(大模型微调)

大模型微调——PEFT PEFT(参数高效微调)是用于高效微调大模型的技术,针对全量微调成本高问题。其方法分 Additive、Selective、Reparametrization-based 三类,本文将简要分析其中几个方法的内容 阅读详情

1. 大模型微调简介

大模型(Large Language Models, LLMs)通常是指模型参数量极大的深度学习模型,能够理解和生成人类语言,在大量的文本数据上进行训练,可以执行广泛的任务。

我们首先会想为什么要进行大模型微调,这是因为大模型的训练成本极其高昂,同时大模型的知识库有其滞后性,以及希望在特定任务上的能力能够得到提升。为此,微调(Fine-tuning)成为了一种重要手段,其借鉴于计算机视觉模型的迁移学习,这是一个非常伟大的想法。总之,通过对预训练模型进行针对性调整,我们可以使其适应具体应用场景,那么更新大模型知识的方法除了微调这一种,还有一种叫RAG(增强检索生成),这就是后话了。

2. 微调的主要方法

2.1 全量微调(Full Fine-tuning)
  • 描述:对预训练模型的所有参数都进行更新
  • 优点:灵活性高
  • 缺点:需要较大的计算资源
  • 使用场景:目标任务数据量大且计算资源充足(一般不使用)
2.2 指令微调(Instruction Tuning)
  • 描述:用在特定任务任务下的明确指令和示例也对大模型进行微调,不更新模型知识
  • 优点:专注于特定任务的微调,保留了模型的基础能力
  • 缺点:限制较大,无法充分发挥模型能力
2.3 参数高效微调(Parameter-Efficient Fine-tuning,PEFT)

参数高效微调有以下几种,我们后续会主要实战lora微调,其他的将在后续的文章的里更新。

2.3.1 Adapter Tuning
  • 描述:在模型的每一层插入小型的适配模块,仅训练这些模块的参数
2.3.2 Prompt Tuning
  • 描述:通过优化提示(prompt)而非模型参数来引导模型输出
2.3.3 Prefix Tuning
  • 描述:在模型输入前添加一个连续的且任务特定的向量序列称之为prefix,固定PLM的所有参数,只更新优化特定的任务的prefix
2.3.4 LoRA (Low-Rank Adaptation)
  • 描述:通过低秩分解的方式更新模型权重,显著减少了需要训练的参数数量。

3. 微调的关键步骤

3.1 数据准备

我们要收集与目标任务相关的标注数据。本篇文章将使用alpaca_gpt4_data_zh.json数据集进行微调。

3.2 模型选择

我们要选择适合任务需求的预训练模型,其中Qwen系列的模型在各个尺寸上的都比较齐全,为方便演示本次演示将使用qwen2.5-0.5b。

3.3 超参数设置

我们要确定学习率、批量大小、训练轮数等超参数,但这些都需要我们进行大量的实践,也就是说,什么样的超参数会更好,更多的是根据实验人员的经验来设置的。

3.4 训练与验证

在训练集上进行微调,此次训练会使用huggingface的库peft。

3.5 模型评估与部署

在测试集上全面评估模型性能,确保其满足实际应用需求。

4 微调实战

4.1 实验环境
  • NVIDIA RTX 3060 (12GB)显存
  • transformers==4.46.3
  • peft==0.14.0
  • datasets
4.2 安装依赖
pip install transformers
pip install peft
4.3 准备数据集
from datasets import load_dataset
dataset = load_dataset('json', data_files='alpaca_gpt4_data_zh.json')
# dataset["train"].save_to_disk("alpaca_gpt4_data_zh")
dataset = dataset["train"].train_test_split(test_size=0.1)
4.4 加载预训练模型和分词器
# 模型下载
from modelscope import snapshot_download
model_dir = snapshot_download('Qwen/Qwen2.5-0.5B-Instruct')
import torch
import transformers
from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained(model_dir)
# 设置精度为float16
model = AutoModelForCausalLM.from_pretrained(model_dir, torch_dtype=torch.float16)
# 将模型参数迁移到GPU
model = model.cuda()
# 打印模型结构
print(model)
4.5 配置LoRA
from peft import LoraConfig, get_peft_model, set_peft_model_state_dict, get_peft_model_state_dict, TaskType
lora_r = 32
lora_alpha=16
target_modules=["q_proj", "k_proj", "v_proj"]
loraconfig = LoraConfig(
    r=lora_r,
    lora_alpha=16,
    target_modules=target_modules,
    task_type=TaskType.CAUSAL_LM
)
model = get_peft_model(model,loraconfig)
4.6 数据预处理
def generate_tokenize(one):
    MAX_LENGTH = 256
    input_ids,attention_mask,labels = [],[],[]
    instruction = tokenizer("\n".join(["Human: "+ one["instruction"],one["input"]]).strip() + "\n\nAssistant: ")
    response = tokenizer(one["output"] + tokenizer.eos_token)
    input_ids = instruction["input_ids"] + response["input_ids"]
    attention_mask = instruction["attention_mask"] + response["attention_mask"]
    labels = [-100] * len(instruction["input_ids"]) + response["input_ids"]
    if len(input_ids) > MAX_LENGTH:
        input_ids = input_ids[:MAX_LENGTH]
        attention_mask = attention_mask[:MAX_LENGTH]
        labels = labels[:MAX_LENGTH]
    return {
        "input_ids": input_ids,
        "attention_mask": attention_mask,
        "labels": labels
    }

tokenizer_dataset = dataset.map(generate_tokenize, remove_columns=dataset['train'].column_names)
train_data = tokenizer_dataset['train']
val_data = tokenizer_dataset['test']
4.7 微调模型
from transformers import TrainingArguments, Trainer, DataCollatorForSeq2Seq

args = TrainingArguments(
    output_dir="./lora_ft",
    per_device_train_batch_size=8,
    logging_steps=10,
    num_train_epochs=1,
    fp16=True,
)

trainer = Trainer(
    model=model,
    args=args,
    train_dataset=train_data,
    data_collator=DataCollatorForSeq2Seq(tokenizer=tokenizer, padding=True),
)

trainer.train()
4.8 加载原有模型并合并训练完得到的权重
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
# 模型下载
from modelscope import snapshot_download
model_dir = snapshot_download('Qwen/Qwen2.5-0.5B-Instruct')

tokenizer = AutoTokenizer.from_pretrained(model_dir)
model = AutoModelForCausalLM.from_pretrained(model_dir, torch_dtype=torch.float16)
model = model.cuda()

from peft import PeftModel
lora_model = PeftModel.from_pretrained(model, model_id="lora_ft/checkpoint-5492")

prompt = tokenizer("Human: {}\n{}".format("生成一个人们去野营旅行可能需要的十件物品的清单。", "").strip() + "\n\nAssistant: ", return_tensors="pt").to(model.device)
response = tokenizer.decode(lora_model.generate(**prompt,max_length=256,do_sample=False)[0],skip_special_tokens=True)
print(response)
4.9 保存微调后的模型
output_model_dir = "merge_model"
mergemodel = lora_model.merge_and_unload()
mergemodel.save_pretrained(output_model_dir)
tokenizer.save_pretrained(output_model_dir)
4.10 使用微调后的模型
from transformers import AutoModelForCausalLM, AutoTokenizer
model_dir = "merge_model"

tokenizer = AutoTokenizer.from_pretrained(model_dir)
model = AutoModelForCausalLM.from_pretrained(model_dir)
model = model.cuda()

prompt = "生成一个人们去野营旅行可能需要的十件物品的清单。"

messages = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": prompt}
]

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

model_inputs = tokenizer([text], return_tensors="pt").to(model.device)

generated_ids = model.generate(
    **model_inputs,
    max_new_tokens=512
)

generated_ids = [
    output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]

response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)

img

本次微调大概需要25分钟,还是很快的,同时也会发现微调后针对同一个问题回答的效果更好了,当然这只是一个小的实验,仍然有很多工作可以去做,下面是微调前和微调后的对比。

微调前

img

微调后

img

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范
  • …

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署
  • …

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建
  • …

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案
  • …

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

在这里插入图片描述

PEFT中的主流微调方法(LORA、QLoRA、Adapter Tuning、Prefix Tuning、Prompt Tuning、P-Tuning及P-Tuning v2) 阅读详情

相关推荐

大模型高效调参—PEFT库( Parameter-Efficient Fine-Tuning)

大模型高效调参大法——PEFT库( Parameter-Efficient Fine-Tuning)

消极的人永远是对的,积极的人选择勇往直前 8885

大模型高效微调(PEFT)方法大全

按Additive、Selective、Reparametrization-based分类介绍,主要方法会介绍细节,其余方法一句话概括。

xzp740813的博客 3452

参数高效微调方法详解(PEFT,Parameter Efficient Fine-Tuning)

你可以使用几种方法进行参数高效微调,每种方法在参数效率、内存效率、训练速度、模型质量和推断成本方面都有权衡。本文主要讲解了参数高效微调方法的三类中的两类的两种方法,LoRA 和prompt tuning。

祖国翔的博客 2620

大模型微调实战指南:从零开始手把手教你微调大模型

今天分享一篇技术文章,你可能听说过很多大模型的知识,但却从未亲自使用或微调过大模型。大模型微调本身是一件非常复杂且技术难度很高的任务,因此本篇文章仅从零开始,手把手带你走一遍微调大模型的过程,并不会涉及过多技术细节。希望通过本文,你可以了解微调大模型的流程。微调大模型需要非常高的电脑配置,比如GPU环境,相当于你在已经预训练好的基础上再对大模型进行一次小的训练。但是不用担心,本篇文章会使用阿里魔塔社区提供的集成环境来进行,无需使用你自己的电脑配置环境。

2401_84495872的博客 7729

大模型微调Fine-tuning

大模型微调的方案、以阿里云Qwen2.5-7B模型为例,详细演示了基于LLaMA-Factory的微调全流程,包括环境配置、参数调整、训练评估等环节,并针对常见错误提供解决方案。

无痕的博客 1123

大模型高效参数微调技术(Prompt-Tuning、Prefix Tuning、P-Tuning、LoRA...)

在整个NLP领域,整个发展历程是朝着精度更高、少监督,甚至无监督的方向发展的。而 Prompt-Tuning是目前学术界向这个方向进军最新也是最火的研究成果。

酒酿小圆子呀~ 3010

AI大模型应用之微调篇

在大模型的应用当中,微调这个词出现的概率很高,然后与之常做对比的是RAG , 那么何为微调?(写了前面几篇大模型基础篇的文章,感觉还是得好好构建下文章结构,要不后面自己回看都看不明白了,写完后还是需要花点时间来整理一下~)

fengruxue的专栏 1272

【LLM】Prompt tuning大模型微调实战

- 给出好的prompt可以让LLM生成更好的答案,反过来想通过LLM帮我们找到好的prompt就是prompt tuning的思路,训练让模型看到新的例子生成prompt,并把该段prompt作为前缀拼接到我们自己的prompt上,送入LLM得到结果 - prompt tuning训练的前缀是向量,所以解释性略差 - 和few show比较:LLM的上下文context长度是有限的(prompt中给出有限的例子,业务复杂时难让模型学习足够多知识),prompt tuning就没有这个限制,只需在训练

发现问题,并解决问题,批判性思维 1万+

大模型微调之一

这种方法通过将权重矩阵的增量更新参数化为奇异值分解(Singular Value Decomposition, SVD)的形式,有效地剪枝不重要更新的奇异值,减少它们的参数预算,同时避免了进行密集的精确SVD计算。QLoRA的工作原理是先将预训练语言模型进行4位量化,显著减少模型的内存占用,然后使用低阶适配器(LoRA)方法对量化的模型进行微调。是非常流行的PEFT方法,属于Adapters的一种。Adapters是一种非常好的微调大模型的方法,可以在不改变原始LLM参数的情况下,增加新的任务。

weixin_42001184的博客 515

【AI黑话日日新】Day 037|Fine-tuning(微调)

微调是把通用底座改造成你专属“专业选手”的那道工序——它解决的是“怎么说话、按什么格式、走什么风格”,而不是“去哪找最新事实”。

专注:太空算力、AI infra、异构调度、大模型成本工程 107

Transformer实战(27)——参数高效微调(Parameter Efficient Fine-Tuning,PEFT)

在本节中,我们讨论了如何利用参数高效微调 (Parameter Efficient Fine-Tuning, PEFT) 使微调过程更加高效。我们介绍了三种不同的 PEFT 方法:加性、选择性和低秩方法。使用 adapter-transformers 和 Hugging Face 的 PEFT 框架进行实践,解决了文本分类任务,在不需要训练整个语言模型的情况下,实现了相近的性能,并节省了大量时间。

盼小辉丶的博客 2957

通俗解读大模型微调(Fine Tuning)

摘要:本文深入浅出地讲解了大模型微调技术。大模型本质上是处理序列转换的复杂参数矩阵,微调能显著提升其在特定领域的表现。文章分析了微调的必要性,包括降低成本、提高效果、保障数据安全等,并对比了全量微调(FFT)与参数高效微调(PEFT)的优劣。重点介绍了Prompt Tuning、Prefix Tuning、LoRA和QLoRA等主流PEFT方案,其中QLoRA通过量化技术将参数量降低至4bit,大幅减少资源消耗。最后指出AI人才缺口巨大,提供了大模型学习资源包获取方式。

bugyinyin的博客 1363

【LLM大模型】指令微调、peft高效参数微调

LLaMA 是 Meta AI 发布的包含 7B、13B、33B 和 65B 四种参数规模的基础语言模型集合,LLaMA-13B 仅以 1/10 规模的参数在多数的 benchmarks 上性能优于 GPT-3(175B),LLaMA-65B 与业内最好的模型 Chinchilla-70B 和 PaLM-540B 比较也具有竞争力。通过使用与 ChatGLM(chatglm.cn)相同的技术,ChatGLM-6B 初具中文问答和对话功能,并支持在单张 2080Ti 上进行推理使用。

发现问题,并解决问题,批判性思维 1万+

【大模型微调实战】使用Peft技术与自己的数据集微调大模型

LLM是大型语言模型的缩写,是人工智能和机器学习领域的最新创新。2022年12月,随着ChatGPT的发布,这种强大的新型人工智能在网上疯传。对于那些足够开明的人来说,生活在人工智能的嗡嗡声和科技新闻周期之外,ChatGPT是一个在名为GPT-3的LLM上运行的聊天界面。最近的大模型就是Meta的llama2当然还有openai的GPT4,google的PaLM2.国内有清华的ChatGLM等等.

aqwca的博客 9218

Xilinx FPGA 100G RDMA开发实战:基于AXI Lite配置的ROCE V2高速通信系统搭建

本文详细介绍了在Xilinx FPGA上搭建100G ROCE V2高速通信系统的实战过程。通过分析RDMA技术优势与FPGA实现的必要性,重点阐述了基于AXI Lite接口配置ERNIC IP核的关键步骤,包括硬件系统构建、驱动开发及与商用网卡的互通测试,旨在实现兼具高性能与灵活性的网络加速方案。

js777的博客 576

脑电数据预处理八:基于 ICA 的伪迹去除

摘要: 脑电图(EEG)数据分析中,伪迹(如眼电、心电、肌电)与脑电信号频谱重叠时,独立成分分析(ICA)成为有效工具。ICA通过盲源分离将混合信号分解为统计独立的成分,识别并移除伪迹后重建干净信号。MNE-Python实现步骤包括:数据预处理(滤波、坏导处理)、ICA分解、人工与自动结合识别伪迹成分、剔除后重建数据。实践建议强调人工检查的重要性,避免过度使用ICA,并保存模型以提高效率。该方法显著提升数据质量,为后续分析奠定基础。

qq_32516809的博客 1658

高效微调算法 (Parameter-Efficient Fine-tuning, PEFT) 详解

通常情况下, 只需要存储少量的微调参数 (例如,Adapter 模块参数,Prefix 参数,LoRA 适配器参数), 原始预训练模型参数保持冻结。全参数微调需要更新 PLMs 的所有参数, 对于参数规模巨大的模型 (例如,数十亿、千亿参数), 微调过程需要消耗大量的计算资源 (GPU 算力) 和时间。例如, 对于文本分类任务, 可以将 Prompt 向量拼接在输入文本之前, 引导模型预测文本的类别。, 即模型在适应新任务的同时, 会遗忘在预训练阶段学习到的通用知识, 尤其是在下游任务数据量较小的情况下。

YPeng_Gao的博客 2395

探索数据库领域 SQL 的 JSON 数据处理技巧

在当今数字化时代,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,被广泛应用于各种领域,如 Web 应用、移动应用、大数据处理等。数据库作为数据存储和管理的核心,需要具备处理 JSON 数据的能力。本文章的目的在于深入探索 SQL 语言在数据库中处理 JSON 数据的技巧,涵盖从基础的 JSON 数据查询到复杂的 JSON 数据操作,帮助读者全面了解和掌握 SQL 处理 JSON 数据的方法。

2502_91592937的博客 924

大模型应用:一文搞懂Fine-tuning,模型微调有啥好处,从理论到实操

我们前面几篇博文中出现的大模型,都是通用的大模型。但在更专业的领域,需要更专业的模型,这就需要用到模型微调的能力。从NLP范式发展的趋势来看,prompt+模型的方式已经成为主流,已经很成熟了,在进行模型微调之前最好确信自己需要这样做。

zhishi0000的博客 2218

用 C# 快速构建一套可扩展的上位机框架(实战+源码思想)

本文介绍了一套基于C#的工业上位机开发框架设计方案。该框架通过模块化设计解决了上位机开发中的常见痛点,包括协议适配、通信管理、UI绑定等问题。核心架构采用分层设计,包含协议接口层、调度器层、通信抽象层和UI层,支持MVVM模式。框架提供了协议插件化扩展能力,通过JSON配置实现设备协议定义,同时封装了日志管理、异常处理等基础功能。该方案具有快速搭建、协议驱动、UI分离等特点,可显著提升上位机开发效率,适用于串口、TCP等多种通信场景,并能快速适配新设备协议。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 885

再相逢【知识图谱】中文医学知识图谱CMeKG,中文产科医学知识图谱COKG | 附:图数据库Neo4j下载安装教学(遇到问题并解决) + Neo4j基本操作

本篇文章介绍知识图谱的相关知识。从便于理解的角度切入,给出知识图谱的形象化定义,并介绍了国内的中文医学知识图谱CMeKG,还以用户视角体验了中文产科医学知识图谱。目录二介绍了如何部署安装Neo4j数据库,并解决了部署过程中遇到的一些基础错误,随后介绍了Neo4j图数据库的基础操作。

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 2615

一文搞懂Fine-tuning,模型微调有啥好处,从理论到实操

我们前面几篇博文中出现的大模型,都是通用的大模型。但在更专业的领域,需要更专业的模型,这就需要用到模型微调的能力。从NLP范式发展的趋势来看,prompt+模型的方式已经成为主流,已经很成熟了,在进行模型微调之前最好确信自己需要这样做。

h1453586413的博客 1426

动画实例化:千人同屏不卡顿的秘密

是一种将大量相同骨骼结构的角色动画批量处理、批量渲染的技术。动画计算与渲染解耦,动画数据在CPU或GPU上批量计算,渲染时通过GPU Instancing一次性绘制大量角色。极大减少DrawCall,提升大规模角色(如MMO、RTS、群体AI等)动画的运行效率。动画Bake:编辑器下将所有动画片段Bake为骨骼矩阵纹理。实例参数管理:每个角色维护自己的动画状态、帧索引等。批量渲染:用DrawMeshInstancedIndirect等API批量渲染,Shader中采样骨骼数据。剔除与LOD。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 421
上一篇: 解析大模型常用微调方法:P-Tuning、Prefix Tuning、Adapter、LoRA
下一篇: 一文学会基于LangChain开发大模型RAG知识问答应用
Python_金钱豹
博客等级 码龄5年 1万+粉丝 2835原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值