Code Llama代码生成模型现在可以通过Amazon SageMaker JumpStart获得

立即获取Code Llama代码生成模型:通过Amazon SageMaker JumpStart获取最新技术

今天,我们很高兴地宣布由Meta开发的Code Llama基础模型现已通过Amazon SageMaker JumpStart提供给客户,以便一键部署进行推断运行。Code Llama是一种先进的大型语言模型(LLM),能够根据代码和自然语言提示生成代码和关于代码的自然语言。Code Llama可用于研究和商业用途,免费使用。您可以通过SageMaker JumpStart尝试此模型,SageMaker JumpStart是一个机器学习(ML)中心,提供算法、模型和ML解决方案的访问,因此您可以快速开始使用ML。在本文中,我们将介绍如何通过SageMaker JumpStart发现和部署Code Llama模型。

Code Llama是什么

Code Llama是由Meta发布的模型,它基于Llama 2构建,并且是一个先进的模型,旨在通过帮助开发人员创建高质量、有文档的代码来提高编程任务的生产力。这些模型在Python、C++、Java、PHP、C#、TypeScript和Bash上展现了最先进的性能,并有潜力节省开发人员的时间,使软件工作流更加高效。它有三个变体,设计用于覆盖各种应用:基础模型(Code Llama)、Python专用模型(Code Llama-Python)和用于理解自然语言指令的指令遵循模型(Code Llama-Instruct)。所有Code Llama变体都有三个尺寸:7B、13B和34B参数。7B和13B的基础和指令变体支持基于周围内容的填充,使它们非常适用于代码助手应用程序。

这些模型是使用Llama 2作为基础进行设计,然后在5000亿个代码标记上进行训练,其中Python专用版本在增量的1000亿个代码标记上进行训练。Code Llama模型提供了具有最多100,000个上下文标记的稳定生成结果。所有模型都是在16,000个标记的序列上进行训练,并在最多100,000个标记的输入上显示改进。

该模型采用与Llama 2相同的社区许可证发布。

SageMaker JumpStart是什么

借助SageMaker JumpStart,机器学习从业者可以从日益增长的最佳基础模型列表中进行选择。机器学习从业者可以将基础模型部署到网络隔离环境中的专用Amazon SageMaker实例中,并使用SageMaker进行模型训练和部署。

您现在可以通过几个点击在Amazon SageMaker Studio或通过SageMaker Python SDK以编程方式发现和部署Code Llama模型,这使得您能够利用SageMaker功能对模型性能和MLOps进行控制,例如Amazon SageMaker PipelinesAmazon SageMaker Debugger或容器日志。该模型在AWS安全环境中部署,并在您的VPC控制下,有助于确保数据安全。Code Llama模型可在美国东部(弗吉尼亚北部)、美国西部(俄勒冈)和欧洲(爱尔兰)地区发现和部署。

客户必须接受EULA以通过SageMaker SDK部署模型。

发现模型

您可以通过SageMaker Studio UI和SageMaker Python SDK访问SageMaker JumpStart中的Code Llama基础模型。在本节中,我们将介绍如何在SageMaker Studio中发现这些模型。

SageMaker Studio是一个集成的开发环境(IDE),提供了一个单一的基于Web的可视界面,在此界面中,您可以访问特定工具,执行所有机器学习开发步骤,从数据准备到构建、训练和部署ML模型。关于如何入门和设置SageMaker Studio的详细信息,请参阅Amazon SageMaker Studio

在SageMaker Studio中,您可以访问SageMaker JumpStart,其中包含预训练模型、笔记本和预构建的解决方案,位于预构建和自动化解决方案下。

在SageMaker JumpStart首页,您可以浏览解决方案、模型、笔记本和其他资源。您可以在基础模型:文本生成轮播图中找到Code Llama模型。

您还可以选择浏览所有文本生成模型或搜索Code Llama来找到其他模型变体。

您可以选择模型卡片查看有关模型的详细信息,例如许可证、用于训练的数据以及使用方法。您还将找到两个按钮部署打开笔记本,这将帮助您使用该模型。

部署

当您选择部署并确认条款后,部署将开始。或者,您可以通过选择打开笔记本来通过示例笔记本进行部署。示例笔记本提供有关如何为推理部署模型以及清理资源的端到端指导。

要使用笔记本进行部署,我们首先通过选择model_id来选择合适的模型。您可以使用以下代码在SageMaker上部署任何所选模型:

from sagemaker.jumpstart.model import JumpStartModelmodel = JumpStartModel(model_id="meta-textgeneration-llama-codellama-7b")predictor = model.deploy()

这将使用默认配置(包括默认实例类型和默认VPC配置)在SageMaker上部署模型。您可以通过在JumpStartModel中指定非默认值来更改这些配置。部署完成后,您可以通过SageMaker预测器对部署的端点进行推理:

payload = {   "inputs": "<s>[INST] 如何在Amazon SageMaker上部署模型? [/INST]",   "parameters": {"max_new_tokens": 512, "temperature": 0.2, "top_p": 0.9}}predictor.predict(payload, custom_attributes="accept_eula=true")

请注意,默认情况下,accept_eula设置为false。您需要将accept_eula=true设置为成功调用端点。通过这样做,您接受了早期提到的用户许可协议和可接受使用政策。您还可以下载许可协议。

用于传递EULA的Custom_attributes是键值对。键和值之间用=分隔,对之间用;分隔。如果用户多次传递相同的键,则保留最后一个值并将其传递给脚本处理程序(在此案例中用于条件逻辑)。例如,如果向服务器传递accept_eula=false; accept_eula=true,则将保留accept_eula=true并将其传递给脚本处理程序。

推理参数控制端点上的文本生成过程。最大新令牌控制模型生成的输出大小。请注意,这与单词数量并不相同,因为模型的词汇表与英语词汇表不同,每个令牌可能不是英语单词。温度控制输出中的随机性。较高的温度会导致更具创造性和幻觉性的输出。所有推理参数都是可选的。

下表列出了SageMaker JumpStart中所有可用的CodeLlama模型,以及每个模型的模型ID、默认实例类型和支持的最大令牌数(所有并发请求的输入令牌数量和生成令牌数量之和)。

模型名称 模型ID 默认实例类型 最大支持令牌数
CodeLlama-7b meta-textgeneration-llama-codellama-7b ml.g5.2xlarge 10000
CodeLlama-7b-Instruct meta-textgeneration-llama-codellama-7b-instruct ml.g5.2xlarge 10000
CodeLlama-7b-Python meta-textgeneration-llama-codellama-7b-python ml.g5.2xlarge 10000
CodeLlama-13b meta-textgeneration-llama-codellama-13b ml.g5.12xlarge 32000
CodeLlama-13b-Instruct meta-textgeneration-llama-codellama-13b-instruct ml.g5.12xlarge 32000
CodeLlama-13b-Python meta-textgeneration-llama-codellama-13b-python ml.g5.12xlarge 32000
CodeLlama-34b meta-textgeneration-llama-codellama-34b ml.g5.48xlarge 48000
CodeLlama-34b-Instruct meta-textgeneration-llama-codellama-34b-instruct ml.g5.48xlarge 48000
CodeLlama-34b-Python meta-textgeneration-llama-codellama-34b-python ml.g5.48xlarge 48000

尽管CodeLlama模型的上下文长度为16,000个令牌,但这些模型在更大的上下文窗口上表现良好。前述表格中的最大支持令牌数是默认实例类型上受支持上下文窗口的上限。由于CodeLlama 7B模型只能在ml.g5.2xlarge实例上支持10,000个令牌,我们建议如果您的应用程序需要更大的上下文,则部署13B或34B模型版本。

默认情况下,所有模型都适用于代码生成任务。基本和instruct模型都响应于补全任务,尽管在大多数示例查询中,基本模型的输出质量更好。最后,只有instruct模型适用于教学任务。以下表格说明了在演示笔记本中示例查询中哪些模型表现良好(Good)和适度(Moderate)。

. 代码生成 代码填充 代码指令
CodeLlama-7b 不适用
CodeLlama-7b-Instruct 中等
CodeLlama-7b-Python 不适用 不适用
CodeLlama-13b 不适用
CodeLlama-13b-Instruct 中等
CodeLlama-13b-Python 不适用 不适用
CodeLlama-34b 不适用 不适用
CodeLlama-34b-Instruct 不适用
CodeLlama-34b-Python 不适用 不适用

代码生成

以下示例在CodeLlama-34b-Instruct模型上运行,使用有效载荷参数"parameters": {"max_new_tokens": 256, "temperature": 0.2, "top_p": 0.9}

导入套接字
def ping_exponential_backoff(host: str):
    """Ping a host using exponential backoff."""
    for i in range(1, 10):
        try:
            socket.gethostbyname(host)
            return True
        except socket.gaierror:
            time.sleep(2 ** i)
    return False

导入argparse
def main(string: str):
    print(string)
    print(string[::-1])

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("string", help="要打印的字符串")
    args = parser.parse_args()
    main(args.string)

代码填充

代码填充涉及返回给定上下文的生成代码。这与代码生成任务不同,因为除了前缀代码段外,模型还提供了一个代码段后缀。在微调过程中使用特殊标记符号来标记前缀的开始(<PRE>)、后缀的开始(<SUF>)和中间的开始(<MID>)。向模型输入的序列应该采用以下格式之一:

  • 前缀-后缀-中间<PRE> {前缀} <SUF>{后缀} <MID>
  • 后缀-前缀-中间<PRE> <SUF>{后缀} <MID> {前缀}

以下示例在 CodeLlama-7b 模型上使用前缀-后缀-中间格式,并带有载荷 parameters {"max_new_tokens": 256, "temperature": 0.05, "top_p": 0.9}

输入<PRE> def remove_non_ascii(s: str) -> str:    """ <SUF>    返回结果 <MID>输出    从字符串中删除非ASCII字符。    :param s: 要删除非ASCII字符的字符串。    :return: 删除非ASCII字符的字符串。    """    结果 = ""    for c in s:        if ord(c) < 128:            结果 += c输入# 安装说明:    ```bash<FILL>    ```这将下载 LLaMA 推理代码并将存储库安装为本地 pip 软件包。输出    git clone https://github.com/LLaMA-AI/LLaMA-inference.git    cd LLaMA-inference    pip install -e .输入class InterfaceManagerFactory(AbstractManagerFactory):    def __init__(<FILL>def main():    factory = InterfaceManagerFactory(start=datetime.now())    managers = []    for i in range(10):        managers.append(factory.build(id=i))输出self, start=None):        self.start = start    def build(self, id):        return InterfaceManager(id, self.start)输入/-- 如果所有 etalisations 都是 1 连接,则拟前函子是 1 连接的。 -/theorem connected_iff_etalisation [C D : precategoroid] (P : quasi_prefunctoid C D) :  π₁ P = 0 ↔ <FILL> = 0 :=begin  split,  { intros h f,    rw pi_1_etalisation at h,    simp [h],    refl  },  { intro h,    have := @quasi_adjoint C D P,    simp [←pi_1_etalisation, this, h],    refl  }end输出∀ f : C ⟶ D,π₁ (P.etalise f)

代码指南

Meta 还提供了面向指令的 Code Llama 变体。本节中的示例查询仅适用于这些面向指令的 Code Llama 模型,即具有模型ID instruct 后缀的模型。Code Llama 的指令格式与 Llama-2-chat 提示格式相同,我们在Llama 2 foundation models are now available in SageMaker JumpStart中进行了详细说明

简单的用户提示可能如下所示:

<s>[INST] {user_prompt} [/INST]

您还可以使用以下语法添加系统提示:

<s>[INST] <<SYS>>{system_prompt}<</SYS>>{user_prompt} [/INST]

最后,您可以通过在输入中包含所有先前的用户提示和助手响应来进行对话交互:

<s>[INST] <<SYS>>{system_prompt}<</SYS>>{user_prompt_1} [/INST] {assistant_response_1} </s><s>[INST] {user_prompt_1} [/INST]

这些示例在 CodeLlama-13b-Instruct 模型上运行,带有载荷参数 “parameters”: {"max_new_tokens": 512, "temperature": 0.2, "top_p": 0.9}

输入<s>[INST] 在 Bash 中,如何列出当前目录中在最近一个月内修改过的所有文本文件(不包括子目录)? [/INST] 输出您可以在 Bash 中使用 `find` 命令来列出当前目录中在最近一个月内修改过的所有文本文件(不包括子目录)。以下是一个示例命令:```find . -type f -name "*.txt" -mtime -30```以下是命令的详细说明:* `find .`:表示让 `find` 在当前目录及其所有子目录中搜索。* `-type f`:表示只搜索文件(不搜索目录)。* `-name "*.txt"`:表示只搜索扩展名为 `.txt` 的文件。* `-mtime -30`:表示只搜索最近 30 天(2,592,000 秒)内修改过的文件。命令的输出将是当前目录中在最近一个月内修改过的所有文本文件(不包括子目录)的列表。输入<s>[INST] 中序遍历和前序遍历有什么区别?用 Python 给出一个示例。 [/INST] 输出中序遍历和前序遍历是遍历二叉树的两种不同方式。中序遍历是按照特定顺序访问二叉树的节点。在中序遍历中,首先访问左子树,然后访问当前节点,最后访问右子树。这意味着节点按照从左到右、从顶到底的顺序进行访问。前序遍历则是以不同的顺序访问二叉树的节点。在前序遍历中,首先访问当前节点,然后访问左子树,最后访问右子树。这意味着节点按照从顶到底、从左到右的顺序进行访问。下面是在 Python 中进行中序遍历的示例:```def inorder_traversal(root):    if root is None:        return []    return inorder_traversal(root.left) + [root.val] + inorder_traversal(root.right)```以下是在 Python 中进行前序遍历的示例:```def preorder_traversal(root):    if root is None:        return []    return [root.val] + preorder_traversal(root.left) + preorder_traversal(root.right)```在此示例中,`inorder_traversal` 函数按照键的顺序返回树中的值列表,从最小到最大。`preorder_traversal` 函数按照键的顺序返回树中的值列表,但是当前节点在其子节点之前访问。输入<s>[INST] <<SYS>>使用 JavaScript 提供答案<</SYS>>编写一个计算给定列表所有连续子列表和的函数。 [/INST] 输出function contiguousSublistSums(list) {  let sums = [];  for (let i = 0; i < list.length; i++) {    let sum = 0;    for (let j = i; j < list.length; j++) {      sum += list[j];      sums.push(sum);    }  }  return sums;}console.log(contiguousSublistSums([1, 2, 3, 4, 5])); // [1, 3, 6, 10, 15]console.log(contiguousSublistSums([1, 2, 3, 4, 5, 6])); // [1, 3, 6, 10, 15, 21]console.log(contiguousSublistSums([1, 2, 3, 4, 5, 6, 7])); // [1, 3, 6, 10, 15, 21, 28]console.log(contiguousSublistSums([1, 2, 3, 4, 5, 6, 7, 8])); // [1, 3, 6, 10, 15, 21, 28, 36]console.log(contiguousSublistSums([1, 2, 3, 4, 5, 6, 7, 8, 9])); // [1, 3, 6, 10, 15, 21, 28, 36, 45]

清理

在完成运行笔记本之后,请确保删除所有在过程中创建的资源,以停止计费。使用以下代码:

predictor.delete_model()predictor.delete_endpoint()

结论

在本篇文章中,我们向您展示了如何在SageMaker Studio中开始使用Code Llama模型,并部署用于生成代码和自然语言的模型,以应对代码和自然语言提示。因为基础模型是预训练的,它们可以帮助降低训练和基础设施成本,并为您的用例提供定制化功能。立即访问SageMaker Studio中的SageMaker JumpStart,开始使用吧。

资源