解密大型语言模型的密码:Databricks 教会了我什么

Decoding the Secrets of Large Language Models What Databricks Taught Me

学习构建自己的端到端生产就绪的LLM工作流

Brett Jordan在Unsplash上的照片

在人工智能日益影响世界的背景下,大型语言模型(LLMs)已经成为机器学习领域的明珠。这些技术奇迹能够生成类似人类的文本并理解语言的复杂性,已经在自然语言处理到内容生成等各个领域找到了应用。随着对基于LLM的应用需求的飙升,掌握利用这些模型潜力的熟练工程师的需求变得更加关键。

数据光晕公司(Databricks)在大数据领域的开创性进展使其成为人工智能的代名词。在他们追求民主化人工智能的过程中,他们推出了一个开创性的项目:大型语言模型。这些课程旨在面向新手爱好者和经验丰富的专家,提供了一条全面的路线图,以掌握构建和利用LLMs用于现代应用的艺术。让我们踏上这个发现之旅,深入了解这些课程对于热衷于机器学习和自然语言处理领域的任何人来说都是不可或缺的资产。

LLMs计划:简要概述

数据光晕公司的大型语言模型项目包括两个独特但相互关联的课程:“LLMs:应用到生产”和“LLMs:从基础模型开始”。这些课程涵盖的主题多样而全面。

课程1:LLMs – 应用到生产

在快节奏的技术世界中,这门课程的与众不同之处在于它的实用性。针对开发人员、数据科学家和工程师,这门课程将使您掌握使用最新框架构建以LLM为中心的应用所需的技能。以下是您将深入研究的一些内容:

发挥LLMs的威力:您将学习如何使用流行的库(如Hugging Face和LangChain)将LLMs应用于自然语言处理中的实际问题。通过实践练习,您将能够熟练利用这些库以最大限度地发挥影响力。

import torchfrom transformers import AutoModelForCausalLM, AutoTokenizertokenizer = AutoTokenizer.from_pretrained("gpt2")model = AutoModelForCausalLM.from_pretrained("gpt2")# 使用GPT-2生成文本input_text = "从前有一天,"input_ids = tokenizer(input_text, return_tensors="pt").input_idsoutput = model.generate(input_ids, max_length=100)generated_text = tokenizer.decode(output[0], skip_special_tokens=True)print(generated_text)

添加领域知识:深入研究如何通过嵌入和向量数据库增强您的LLM流程中的领域知识和记忆。这项宝贵的技能使您能够针对特定应用定制您的模型。

from langchain.text_splitter import CharacterTextSplitterfrom langchain.embeddings import HuggingFaceEmbeddingsfrom langchain.vectorstores import Chroma# 首先,我们将数据分成可管理的块以存储为向量。 # 这没有确切的方法来做到这一点,更多的块意味着更详细的上下文,# 但会增加我们的向量存储的大小。text_splitter = CharacterTextSplitter(chunk_size=250, chunk_overlap=10)texts = text_splitter.split_documents(document)# 现在,我们将为文档创建嵌入,以便我们可以将其存储在向量存储中,并将数据输入到LLM中。我们将使用句子-变换器模型来进行嵌入。 # https://www.sbert.net/docs/pretrained_models.html#sentence-embedding-models/model_name = "sentence-transformers/all-MiniLM-L6-v2"embeddings = HuggingFaceEmbeddings(    model_name=model_name, cache_folder=DA.paths.datasets)  # 使用预缓存的模型# 最后,我们使用chromadb和嵌入LLM创建我们的索引chromadb_index = Chroma.from_documents(    texts, embeddings, persist_directory=DA.paths.working_dir)from langchain.chains import RetrievalQAfrom langchain.llms import HuggingFacePipeline# 我们希望将其作为检索器,因此我们需要转换我们的索引。# 这将创建一个围绕我们的向量数据库功能的包装器,以便我们可以在向量存储中搜索相似的文档/块并检索结果:retriever = chromadb_index.as_retriever()# 这个链将用于对文档进行问答。我们将需要# 1 - LLM来进行语言解释# 2 - 可以执行文档检索的向量数据库# 3 - 如何处理此数据的规范(稍后详细介绍)hf_llm = HuggingFacePipeline.from_model_id(    model_id="google/flan-t5-large",    task="text2text-generation",    model_kwargs={        "temperature": 0,        "max_length": 128,        "cache_dir": DA.paths.datasets,    },)chain_type = "stuff"  # 选项:stuff, map_reduce, refine, map_reranklaptop_qa = RetrievalQA.from_chain_type(    llm=hf_llm, chain_type="stuff", retriever=retriever)# 让我们询问这个链关于我们所拥有的产品。laptop_name = laptop_qa.run("这台笔记本电脑的全名是什么?")display(laptop_name)

精细调整掌握:了解预训练、精细调整和提示工程的细微差别。您将获得精细调整自定义聊天模型的专业知识,为高度专业化的应用打开大门。

import transformers as trtraining_args = tr.TrainingArguments(    local_checkpoint_path,    num_train_epochs=1,  # 默认训练轮数为3    per_device_train_batch_size=16,    optim="adamw_torch",    report_to=["tensorboard"],)# 加载预训练模型model = tr.AutoModelForSeq2SeqLM.from_pretrained(    model_checkpoint, cache_dir=DA.paths.datasets)  # 使用预缓存模型# 辅助训练器进行数据批处理的数据收集器data_collator = tr.DataCollatorWithPadding(tokenizer=tokenizer)trainer = tr.Trainer(    model,    training_args,    train_dataset=tokenized_dataset["train"],    eval_dataset=tokenized_dataset["test"],    tokenizer=tokenizer,    data_collator=data_collator,)trainer.train()# 将模型保存到本地检查点trainer.save_model()trainer.save_state()# 将精细调整的模型持久化到 DBFSfinal_model_path = f"{DA.paths.working_dir}/llm_fine_tuning/{checkpoint_name}"trainer.save_model(output_dir=final_model_path)fine_tuned_model = tr.AutoModelForSeq2SeqLM.from_pretrained(final_model_path)inputs = tokenizer(reviews, return_tensors="pt", truncation=True, padding=True)pred = fine_tuned_model.generate(    input_ids=inputs["input_ids"], attention_mask=inputs["attention_mask"])

评估功效和偏见:在伦理关注的时代,学习如何使用各种方法严格评估您的LLM的效果和潜在偏见。

import evaluatetoxicity = evaluate.load("toxicity", module_type="measurement")from transformers import AutoTokenizer, AutoModelForCausalLMimport shaptokenizer = AutoTokenizer.from_pretrained(    "gpt2", use_fast=True, cache_dir=DA.paths.datasets)model = AutoModelForCausalLM.from_pretrained("gpt2", cache_dir=DA.paths.datasets)# 将模型解码器设置为true# GPT是一个仅有解码器的模型model.config.is_decoder = True# 我们为输出文本生成设置配置model.config.task_specific_params["text-generation"] = {    "do_sample": True,    "max_length": 50,    "temperature": 0,  # 关闭随机性    "top_k": 50,    "no_repeat_ngram_size": 2,}input_sentence = ["晴天是去海滩的最佳时机。所以"]explainer = shap.Explainer(model, tokenizer)shap_values = explainer(input_sentence)shap.plots.text(shap_values)shap.plots.bar(shap_values[0, :, "looking"])

LLMOps和多步推理:发现LLMOps在大规模部署模型和解锁LLM工作流中多步推理的潜力方面的最佳实践。

import mlflow# 告诉MLflow Tracking使用此明确的实验路径,# 它位于工作空间浏览器(左侧边栏)下的您的主目录中。mlflow.set_experiment(f"/Users/{DA.username}/LLM 06 - MLflow experiment")with mlflow.start_run():    # 记录参数    mlflow.log_params(        {            "hf_model_name": hf_model_name,            "min_length": min_length,            "max_length": max_length,            "truncation": truncation,            "do_sample": do_sample,        }    )# 记录模型的“签名”,告诉MLflow模型的输入和输出模式。  signature = mlflow.models.infer_signature(      xsum_sample["document"][0],      mlflow.transformers.generate_signature_output(          summarizer, xsum_sample["document"][0]      ),  )  print(f"Signature:\n{signature}\n")  # 对于mlflow.transformers,如果有推理时的配置,  # 需要在log_model调用(下面)中特别保存它们。  # 这确保了当重新加载时,流水线将使用相同的配置。  inference_config = {      "min_length": min_length,      "max_length": max_length,      "truncation": truncation,      "do_sample": do_sample,  }  # 记录模型返回一个对跟踪服务器中模型元数据的句柄`model_info`。  # 此`model_info`在笔记本的后面将对检索记录的模型非常有用。  model_info = mlflow.transformers.log_model(      transformers_model=summarizer,      artifact_path="summarizer",      task="summarization",      inference_config=inference_config,      signature=signature,      input_example="这是一篇长新闻文章的示例,此流水线可以为您进行摘要。",  )

通过掌握这些技能,您将能够充分准备应对现实世界中LLM应用的挑战。

我喜欢这门课程的原因:

  1. 实践重点:该课程专为实践者设计。它通过使用Hugging Face和LangChain等流行框架,为您提供构建LLM中心化应用所需的技能。非常适合开发人员、数据科学家和工程师在现实场景中应用LLM。
  2. 行业专业知识:该课程由业界领袖和知名研究人员领导,包括斯坦福大学的Matei Zaharia教授和Databricks的Dolly模型的技术团队。他们的见解和经验提供了宝贵的视角。
  3. 实践实验室:实践实验室的加入确保您不仅理解理论,还能获得实践经验。您将能够构建自己的生产就绪的LLM工作流程。
  4. 伦理考虑:在当今世界,伦理问题至关重要。该课程涉及使用LLM时的社会、安全和伦理考虑,帮助您开发负责任的人工智能方法。
  5. LLMOps最佳实践:您将学习在规模部署模型时的LLMOps最佳实践。对于那些希望将LLM集成到大规模应用中的人来说,这是必不可少的。

可以改进的地方:

  1. 限于实践者:虽然实践重点对于实践者来说非常好,但对于那些寻求更深入理解LLM的理论的人来说可能不太合适(这在课程2中得到解决)。
  2. 需要先前知识:要充分受益于该课程,您应该具备机器学习和深度学习的工作知识。对于完全初学者来说可能不是理想的选择(有关一些先决条件,请参阅下面的资源)。

课程2:LLM —— 从基础模型开始

对于那些渴望深入了解的人来说,这门课程将深入探讨LLM的核心。非常适合对基础模型的内部工作方式感兴趣的数据科学家和爱好者,课程内容包括:

理解基础模型:深入研究为基础模型铺平道路的理论和创新,包括注意力机制、编码器、解码器以及它们演变为GPT-4。

class TransformerEncoderBlock(nn.Module):    def __init__(self, d_model, num_heads, conv_hidden_dim, dropout=0.1):        super(TransformerEncoderBlock, self).__init__()        self.attention = nn.MultiheadAttention(d_model, num_heads, dropout=dropout)        self.norm1 = nn.LayerNorm(d_model)        self.norm2 = nn.LayerNorm(d_model)        self.feed_forward = FeedForward(d_model, conv_hidden_dim, dropout)        self.dropout = nn.Dropout(dropout)    def forward(self, x, mask=None):        # 多头注意力        attn_output, _ = self.attention(x, x, x, attn_mask=mask)        x = x + self.dropout(attn_output)        x = self.norm1(x)        # 前馈神经网络        ff_output = self.feed_forward(x)        x = x + self.dropout(ff_output)        x = self.norm2(x)        return xclass TransformerEncoder(nn.Module):    def __init__(self, vocab_size, d_model, num_heads, conv_hidden_dim, num_layers, dropout=0.1):        super(TransformerEncoder, self).__init__()        self.word_embedding = nn.Embedding(vocab_size, d_model)        self.position_embedding = nn.Embedding(1000, d_model)  # 假设最大序列长度为1000        self.layers = nn.ModuleList(            [                TransformerEncoderBlock(d_model, num_heads, conv_hidden_dim, dropout)                for _ in range(num_layers)            ]        )    def forward(self, x, mask=None):        seq_length = x.shape[1]        positions = torch.arange(0, seq_length).expand(x.shape[0], seq_length).to(x.device)        out = self.word_embedding(x) + self.position_embedding(positions)        for layer in self.layers:            out = layer(out, mask)        return out# 假设以下是超参数vocab_size = 5000  # 词汇表大小d_model = 512  # 词嵌入的维度num_heads = 8  # 注意力头的数量conv_hidden_dim = 2048  # 前馈网络中隐藏层的维度num_layers = 6  # Transformer编码器块的数量dropout = 0.1  # 丢弃率# 实例化模型model = TransformerEncoder(vocab_size, d_model, num_heads, conv_hidden_dim, num_layers, dropout)# 生成一些示例输入input_tensor = torch.randint(0, vocab_size, (1, 20))  # 批量大小为1,序列长度为20# 通过模型进行前向传播output = model(input_tensor, mask=None)print(f"该模型有{sum(p.numel() for p in model.parameters() if p.requires_grad):,}个可训练的参数")

高效微调:探索高级迁移学习技术,如一次性学习、少样本学习和知识蒸馏。学习如何在保持性能的同时减小LLM的大小。了解当前研究和发展对LLM领域的影响,从闪光注意力到LoRa、AliBi和PEFT方法。

import peftfrom peft import LoraConfig, get_peft_modelfrom transformers import AutoModelForCausalLM, AutoTokenizermodel_name = "bigscience/bloomz-560m"tokenizer = AutoTokenizer.from_pretrained(model_name)foundation_model = AutoModelForCausalLM.from_pretrained(model_name)lora_config = LoraConfig(    r=<FILL_IN>,    lora_alpha=1, # 调整权重矩阵幅度的缩放因子。通常设置为1    target_modules=["query_key_value"],    lora_dropout=0.05,     bias="none", # 指定是否训练偏置参数     task_type="CAUSAL_LM")peft_model = get_peft_model(foundation_model, lora_config)print(peft_model.print_trainable_parameters())

LLM部署最佳实践:学习量化技术,通过将32位浮点数转换为较低精度的格式(如8位整数),使模型运行更快、占用更少内存。

# 指定量化配置net.qconfig = torch.ao.quantization.get_default_qconfig("onednn")# 准备模型进行静态量化,这会在模型中插入观察器,观察校准期间的激活张量net_prepared = torch.quantization.prepare(net)# 现在我们将模型转换为量化版本net_quantized = torch.quantization.convert(net_prepared)# 一旦模型被量化,它可以像未量化的模型一样用于推理,但它将占用更少内存,可能具有更快的推理速度,代价是可能降低一定的准确性。

大规模运行LLM:了解如何构建我们自己的简化版专家混合(MoE)LLM系统,通过组件模型的不同专业领域处理各种数据模式。每个专家都有自己的一组参数,通常比有效建模整个数据集所需的模型简单。

# 定义“硬门控”函数# 这个函数根据输入的长度决定使用哪个模型def hard_gating_function(input):    if len(input) < 10:        # 对于长度小于10的输入,使用GPT2模型        return "gpt2", gpt2, gpt2_tokenizer    elif len(input) < 100:        # 对于长度大于10但小于100的输入,使用T5模型        return "t5" , t5, t5_tokenizer    else:        # 对于长度大于100的输入,使用BERT模型        return "bert", bert, bert_tokenizer# 定义“软门控”函数# 这个函数根据输入的长度为每个模型分配一个权重,所有模型都会在一定程度上用于生成输出def soft_gating_function(input):    # 使用softmax函数计算每个模型的权重,得到一个概率分布    weights = F.softmax(torch.tensor([len(input), 100 - len(input), len(input)], dtype=torch.float), dim=0)    # 返回每个模型的权重以及模型和它们的分词器    return {"gpt2": (gpt2, gpt2_tokenizer, weights[0]),            "bert": (bert, bert_tokenizer, weights[1]),            "t5": (t5, t5_tokenizer, weights[2])}

LLM的未来是多模态的:通过一个实际编码项目,了解视觉Transformer的内部工作原理,使用X-CLIP进行视频分类,为提供的文本描述分配概率。该模型包括一个文本编码器、一个跨帧视觉编码器、一个多帧集成Transformer和一个特定于视频的提示生成器。

from transformers import XCLIPProcessor, XCLIPModelmodel_name = "microsoft/xclip-base-patch16-zero-shot"processor = XCLIPProcessor.from_pretrained(model_name)model = XCLIPModel.from_pretrained(model_name)

通过课程的结束,您将精通基础模型的细节,具备理解最新进展的能力,并准备好应对多模态LLM挑战。

我喜欢这门课程的原因:

  1. 深度理论知识:如果您对LLM背后的理论感兴趣,并且想要了解它们的内部运作原理,这门课程非常理想。它涵盖了基础模型的演变,包括注意力机制、编码器、解码器以及它们对GPT-4等模型的贡献。
  2. 高级迁移学习:您将探索高级迁移学习技术,如一次性学习、少样本学习和知识蒸馏,这些技术可以显著减小LLM的大小,同时保持性能。
  3. 面向未来:这门课程提供了最新的LLM发展见解,包括Flash Attention、LoRa、AliBi和PEFT等方法。它使您始终站在LLM研究的前沿。
  4. 多模态应用:随着人工智能应用涉及文本、音频和视觉组件,理解多模态LLM变得越来越重要。这门课程为您应对这些挑战做好了准备。

可以改进的地方:

  1. 理论强调:虽然这门课程在理论内容上丰富,但可能没有第一门课程那么多实践、动手经验。如果您更喜欢更实践的方法,这可能不是您的首选。
  2. 推荐先修课程:虽然推荐完成“LLM:应用到生产”课程,但并不是强制要求的。然而,如果您没有修过第一门课程,您可能需要额外的努力来迎头赶上。

总体而言,这两门课程都具有独特的优势,两者结合起来是在LLM领域成功之旅的明智选择。

拆解学习体验

Databricks的LLM课程不仅仅是另一系列在线讲座。它们提供了一种沉浸式学习体验,丰富了行业领导者和知名研究人员的智慧。这些课程的一些突出特点使其与众不同:

专家指导

在如此动态的人工智能领域,拥有不仅目睹但也积极塑造其演变的导师是无价的。讲师的专业知识贯穿于每个讲座和实验室,为学习者提供了一种独特的视角,这种视角源自学术界、初创公司和F500公司。

动手实验室

没有实践的理论就像没有指南针的船。Databricks的课程中穿插了许多动手实验室,让您可以在真实场景中应用新获得的知识。这些实验室提供了构建自己的生产就绪LLM工作流所需的实践技能。

免费课程材料和证书

与其致力于民主化人工智能的承诺一致,Databricks为希望参与审核的任何人提供免费访问课程材料的机会。如果您希望更深入地参与,只需支付少量费用即可获得课程实验室的托管计算环境、评分练习和完成证书。这个由Databricks支持的证书是您专业资历的宝贵补充。

免费资源

除了课程,Databricks还慷慨地提供免费资源,包括源代码和笔记本,确保您的学习之旅超越课程。提供的GitHub存储库提供了大量的代码示例和实际实现。

视频讲座

对于那些喜欢视觉学习体验的人,Databricks提供了一系列与课程配套的视频讲座。这些讲座作为额外的资源,帮助您加深理解。

未来之路:LLM和更多

随着我们接近探索的终点,我们必须认识到那些踏上LLM之旅的人所面临的巨大潜力和机会。根据IDC的数据,到2025年,90%的企业应用将由人工智能增强,对LLM技术熟练的专业人才的需求正呈现出流星般的增长。根据Burning Glass的数据,近三年来,要求同时具备自然语言处理和深度学习技能的工作职位数量大幅增长了105%。

Databricks的LLM课程毕业生的潜在职业道路就像LLM应用本身的应用一样多样化。从自然语言处理/LLM工程师到数据科学家、机器学习工程师、软件开发人员和研究分析师,只有您的想象力是限制。

结论:你应该加入LLM反叛吗?

在庄严的鼓点声中,让我明确一点 – Databricks的LLM课程对于那些认真征服大型语言模型世界的人来说是一个宝贵的宝库。你将获得的知识、专业知识和经验价值连城,对于所有的星际迷来说,这是金色拉丁币(Latinum)。

那么,你应该追求这些课程吗?毫无疑问!无论你是机器学习爱好者还是想提升自己的数据科学家,Databricks的LLM课程是你踏上星途所需的超级驱动器。

用已故伟大的道格拉斯·亚当斯的话来说:“别慌张”,并加入这些课程。愿LLMs与你同在!

结论:加入这次旅程

当我们结束这次穿越大型语言模型星系的奥德赛时,我敦促你踏上你自己的冒险之旅。Databricks的LLM课程不仅是一次学习经历,更是一次进入机器学习未来的航海。当你在数据和语言模型的不断扩展的宇宙中航行时,请记住:

“我们对明天的实现的唯一限制将是我们今天的怀疑。” — 富兰克林·D·罗斯福。

加入Databricks的LLM课程,让你的怀疑像黎明中的星星一样消散。鼓掌👏,订阅🔔,并持续关注📡,以获取更多关于技术和数据世界的启发性旅程。知识的宇宙等待着我们,我们将勇敢地去往未知的地方。

资源

  1. Databricks的LLM课程介绍
  2. LLM认证
  3. LLM课程1:从应用到生产
  4. LLM课程2:从基础模型开始
  5. LLM课程1:GitHub存储库、幻灯片、视频讲座
  6. LLM课程2:GitHub存储库、幻灯片、视频讲座(即将推出)
  7. Transformers-Tutorials

免责声明:我没有收到Databricks、edX或任何其他方面的任何经济补偿或特殊待遇来撰写这篇文章。这里的观点完全是我自己的,基于我对这些LLM课程的真实经历。

Anand Taralika是一位软件工程师,他写作关于技术生活以及在网络安全、金融、医疗保健和可持续能源领域使用技术、数据和机器学习的文章。直接在您的收件箱中获取故事,以便您不会错过它们!