LLM推理部署(六):TogetherAI推出世界上LLM最快推理引擎,性能超过vLLM和TGI三倍

本文主要是介绍LLM推理部署(六):TogetherAI推出世界上LLM最快推理引擎,性能超过vLLM和TGI三倍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

LLM能有多快?答案在于LLM推理的最新突破。

       TogetherAI声称,他们在CUDA上构建了世界上最快的LLM推理引擎,该引擎运行在NVIDIA Tensor Core GPU上。Together推理引擎可以支持100多个开源大模型,比如Llama-2,并在Llama-2–70B-Chat上每秒生成117个tokens,在Llama2–13B-Chat中每秒生成171个tokens。

文本将从以下几点进行介绍:

  • Together推理引擎技术;
  • 使用Python API进行LLM推理;
  • 与LangChain的集成;
  • 管理聊天历史记录

一、TogetherAI推动LLM推理的极限

       TogetherAI新的LLM推理引擎性能超过vLLM和TGI,如下图所示:

       定价合理,Llama-2–13b Chat不仅比GPT 3.5 Turbo便宜6倍,而且速度快1.85倍。

TogetherAI推理引擎的方法结合了以下三个关键技术:

FlashAttention-2:可以提高LLM的训练和微调速度4倍以上,并在NVIDIA A100s上实现了72%的模型FLOP利用率。这一点很重要,因为传统的注意力计算受内存带宽限制,通常会进行大量内存交换。Flash Attention重组矩阵运算以减少内存交换,使模型速度翻倍或更多;

Flash-Decoding:加快推理过程中的注意力计算,对超长序列,生成速度可以提高8倍。对输入序列中的多个tokens通过重新组织句子计算可以批处理注意力计算。对短Prompt影响很小,但对于较长的序列(例如,10ktokens),性能可能会翻倍;

Medusa:在LLM的最后隐藏状态之上添加多个头来预测下一个token,然后使用模型来验证这个预测的token,推理速度可以提高2倍。

让我们看看TogetherAI在实践中是如何工作的。

二、TogetherAI如何使用

      登录TogetherAI(https://www.together.ai/)并注册即可获得25美元的免费积分。

      TogetherAI提供了使用LLM的各种功能,可以在左侧导航窗格中看到其中的一些功能。

可以在“设置”中找到您的API密钥和帐单信息。

可以在UI上测试不同的功能,但我们真正想要的是通过API访问。

2.1 设置环境

      让我们从设置虚拟环境开始:

mkdir togetherai-serving && cd togetherai-servingpython3 -m venv togetherai-serving-envsource togetherai-serving-env/bin/activatepip3 install ipykernel jupyterpip3 install python-dotenvpip3 install --upgrade togetherpip3 install langchain huggingface_hub# Optionally, fire up VSCode or your favorite IDE and let's get rolling!code .

创建.env文件并添加TogetherAI API密钥:

TOGETHER_API_KEY=<Your API Key>

和导入所需的库:

import osimport timeimport jsonimport loggingfrom datetime import datetimeimport togetherfrom langchain.llms.base import LLMfrom langchain import PromptTemplate,  LLMChainfrom dotenv import load_dotenv # The dotenv library's load_dotenv function reads a .env file to load environment variables into the process environment. This is a common method to handle configuration settings securely.# Load env variablesload_dotenv()# Set up logginglogging.basicConfig(level=logging.INFO)

2.2 了解TogetherAI Python API

我们现在可以查看一下TogetherAI支持的模型,并选择一个来使用:

model_list = together.Models.list()print(f"There are {len(model_list)} models to choose from!")[model['name'] for model in model_list][:20]

总共支持103个模型,下面查看前20个模型

There are 103 models to choose from!['Austism/chronos-hermes-13b','EleutherAI/llemma_7b','EleutherAI/pythia-12b-v0', 'EleutherAI/pythia-1b-v0', 'EleutherAI/pythia-2.8b-v0', 'EleutherAI/pythia-6.9b', 'Gryphe/MythoMax-L2-13b', 'HuggingFaceH4/starchat-alpha', 'NousResearch/Nous-Hermes-13b', 'NousResearch/Nous-Hermes-Llama2-13b', 'NousResearch/Nous-Hermes-Llama2-70b', 'NousResearch/Nous-Hermes-llama-2-7b', 'NumbersStation/nsql-llama-2-7B', 'Open-Orca/Mistral-7B-OpenOrca', 'OpenAssistant/oasst-sft-4-pythia-12b-epoch-3.5', 'OpenAssistant/stablelm-7b-sft-v7-epoch-3', 'Phind/Phind-CodeLlama-34B-Python-v1', 'Phind/Phind-CodeLlama-34B-v2', 'SG161222/Realistic_Vision_V3.0_VAE', 'WizardLM/WizardCoder-15B-V1.0']

让我们使用“togethercomputer/lama-2–7b chat”来生成一个回复:

prompt = "<human>: What do you think about Large Language Models?\n<bot>:"model = "togethercomputer/llama-2-7b-chat"output = together.Complete.create(  prompt = prompt,  model = model,   max_tokens = 256,  temperature = 0.8,  top_k = 60,  top_p = 0.6,  repetition_penalty = 1.1,  stop = ['<human>', '\n\n'])print(json.dumps(output, indent = 4))

花了2秒才得到完整的答案,以下是输出:

{    "id": "8268eed93d23b903-AMS",    "status": "finished",    "prompt": [        "<human>: What do you think about Large Language Models?\n<bot>:"    ],    "model": "togethercomputer/llama-2-7b-chat",    "model_owner": "",    "tags": {},    "num_returns": 1,    "args": {        "model": "togethercomputer/llama-2-7b-chat",        "prompt": "<human>: What do you think about Large Language Models?\n<bot>:",        "top_p": 0.6,        "top_k": 60,        "temperature": 0.8,        "max_tokens": 256,        "stop": [            "<human>",            "\n\n"        ],        "repetition_penalty": 1.1,        "logprobs": null    },    "subjobs": [],    "output": {        "result_type": "language-model-inference",        "choices": [            {                "text": "Large language models, such as transformer-based models like BERT and RoBERTa, have been instrumental in achieving state-of-the-art results in a wide range of natural language processing (NLP) tasks. These models are trained on large amounts of text data and have the ability to learn complex patterns and relationships in language.\n\n"            }        ]    }}

以下是如何获得生成的响应:

print(output['output']['choices'][0]['text'])# Large language models, such as transformer-based models like BERT and # RoBERTa, have been instrumental in achieving state-of-the-art results # in a wide range of natural language processing (NLP) tasks. These models # are trained on large amounts of text data and have the ability to learn # complex patterns and relationships in language.

还可以使用流:

for token in together.Complete.create_streaming(prompt=prompt):    print(token, end="", flush=True)

现在,我们来看看LangChain集成。

三、TogetherAI与LangChain的集成

       为了在LangChain中使用TogetherAI,我们必须扩展基本LLM抽象类。

这里有一个创建自定义LLM包装器的示例代码(https://python.langchain.com/docs/modules/model_io/llms/custom_llm),但我们将通过类型验证、异常处理和日志记录使其变得更好。

class TogetherLLM(LLM):    """    Together LLM integration.    Attributes:        model (str): Model endpoint to use.        together_api_key (str): Together API key.        temperature (float): Sampling temperature to use.        max_tokens (int): Maximum number of tokens to generate.    """        model: str = "togethercomputer/llama-2-7b-chat"    together_api_key: str = os.environ["TOGETHER_API_KEY"]    temperature: float = 0.7    max_tokens: int = 512    @property    def _llm_type(self) -> str:        """Return type of LLM."""        return "together"    def _call(self, prompt: str, **kwargs: Any) -> str:            """Call to Together endpoint."""            try:                logging.info("Making API call to Together endpoint.")                return self._make_api_call(prompt)            except Exception as e:                logging.error(f"Error in TogetherLLM _call: {e}", exc_info=True)                raise    def _make_api_call(self, prompt: str) -> str:        """Make the API call to the Together endpoint."""        together.api_key = self.together_api_key        output = together.Complete.create(            prompt,            model=self.model,            max_tokens=self.max_tokens,            temperature=self.temperature,        )        logging.info("API call successful.")        return output['output']['choices'][0]['text']

       langchain.lms.base模块通过提供比直接实现_generate方法用户更友好的界面来简化与LLM的交互。

       类langchain.lms.base.LLM是LLM的一个抽象基类,这意味着它为其他类提供了一个模板,但并不意味着它自己被实例化。它旨在通过在内部处理LLM的复杂性,为LLM的工作提供一个更简单的界面,允许用户更容易地与这些模型交互。

       __call__方法允许像函数一样调用类,它检查缓存并在给定提示下运行LLM。

我们现在可以创建TogetherLLM的类实例:

llm = TogetherLLM(    model = model,    max_tokens = 256,    temperature = 0.8)

然后创建LLM链:

prompt_template = "You are a friendly bot, answer the following question: {question}"prompt = PromptTemplate(    input_variables=["question"], template=prompt_template)chat = LLMChain(llm=llm, prompt=prompt)

让我们开始对话:

chat("Can AI take over developer jobs?")
INFO:root:Making API call to Together endpoint.INFO:root:API call successful.{'question': 'Can AI take over developer jobs?', 'text': '\n\nNo, AI will not take over developer jobs. AI can assist developers in various ways, such as automating repetitive tasks, generating code, or analyzing data, but it will not replace human developers. Developers are needed to design, build, and maintain complex software systems, which require creativity, critical thinking, and problem-solving skills that AI systems do not possess. Additionally, the field of software development is constantly evolving, and new technologies and techniques are constantly being developed, which requires developers to stay up-to-date and adapt to new challenges.'}

让我们看看还能做些什么。

四、管理聊天历史记录

       单轮聊天是可以,但这是一个聊天模型,我们来学习一下如何管理聊天历史,以实现更连贯和上下文感知的互动。

       以下是LangChain文档中的一个简单图表,显示了流程:

       然而,不想使用LangChain的抽象,而是想重新实现LLMChain类,让用户更好地debug代码。

from typing import Listclass LLMChain:    def __init__(self, llm, prompt):        self.llm = llm        self.prompt = prompt        self.history: List[str] = []  # Initialize an empty list to keep track of the conversation history    def add_to_history(self, user_input: str, bot_response: str):        self.history.append(f"<human>: {user_input}")        self.history.append(f"<bot>: {bot_response}")    def generate_prompt(self, question: str) -> str:        history_str = "\n".join(self.history)  # Convert the history list into a single string        return f"{history_str}\n<human>: {question}\n<bot>:"    def ask(self, question: str) -> str:        full_prompt = self.generate_prompt(question)        response = self.llm._call(full_prompt)  # Assuming _call method handles the actual API call        self.add_to_history(question, response)        return response

       在这个实现中,我们每次调用ask方法时,会话历史都会更新为最新的交换。generate_prompt方法构造一个包含此历史记录的新Prompt来维护会话的上下文。

       通过以下实例看一些如何使用

# Usagellm = TogetherLLM(    model = model,    max_tokens = 256,    temperature = 0.8)prompt_template = "You are a friendly bot, answer the following question: {question}"prompt = PromptTemplate(    input_variables=["question"], template=prompt_template)chat = LLMChain(llm=llm, prompt=prompt)# Example interactionresponse = chat.ask("What is the weather like today?")print(response)  # Bot's response# The next call to chat.ask will include the previous interaction in the promptresponse = chat.ask("How can I enjoy such a weather?")print(response)

       你可能已经注意到,随着聊天历史的增长,很难管理模型的上下文窗口,有几种策略可以处理它,后面会继续分享,敬请期待。

参考文献:

[1] https://medium.com/@datadrifters/the-worlds-fastest-llm-inference-engine-3x-faster-than-vllm-and-tgi-a2ed9e33c55f?source=email-c63e4493b83d-1702407845871-digest.reader--a2ed9e33c55f----2-98------------------775b79bd_d6f0_4703_a101_7e17ca89ae00-1

[2] https://www.together.ai/blog/together-inference-engine-v1

这篇关于LLM推理部署(六):TogetherAI推出世界上LLM最快推理引擎,性能超过vLLM和TGI三倍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/489411

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

闲置电脑也能活出第二春?鲁大师AiNAS让你动动手指就能轻松部署

对于大多数人而言,在这个“数据爆炸”的时代或多或少都遇到过存储告急的情况,这使得“存储焦虑”不再是个别现象,而将会是随着软件的不断臃肿而越来越普遍的情况。从不少手机厂商都开始将存储上限提升至1TB可以见得,我们似乎正处在互联网信息飞速增长的阶段,对于存储的需求也将会不断扩大。对于苹果用户而言,这一问题愈发严峻,毕竟512GB和1TB版本的iPhone可不是人人都消费得起的,因此成熟的外置存储方案开

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

揭秘世界上那些同时横跨两大洲的国家

我们在《世界人口过亿的一级行政区分布》盘点全球是那些人口过亿的一级行政区。 现在我们介绍五个横跨两州的国家,并整理七大洲和这些国家的KML矢量数据分析分享给大家,如果你需要这些数据,请在文末查看领取方式。 世界上横跨两大洲的国家 地球被分为七个大洲分别是亚洲、欧洲、北美洲、南美洲、非洲、大洋洲和南极洲。 七大洲示意图 其中,南极洲是无人居住的大陆,而其他六个大洲则孕育了众多国家和

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

黑神话,XSKY 星飞全闪单卷性能突破310万

当下,云计算仍然是企业主要的基础架构,随着关键业务的逐步虚拟化和云化,对于块存储的性能要求也日益提高。企业对于低延迟、高稳定性的存储解决方案的需求日益迫切。为了满足这些日益增长的 IO 密集型应用场景,众多云服务提供商正在不断推陈出新,推出具有更低时延和更高 IOPS 性能的云硬盘产品。 8 月 22 日 2024 DTCC 大会上(第十五届中国数据库技术大会),XSKY星辰天合正式公布了基于星

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

在 Windows 上部署 gitblit

在 Windows 上部署 gitblit 在 Windows 上部署 gitblit 缘起gitblit 是什么安装JDK部署 gitblit 下载 gitblit 并解压配置登录注册为 windows 服务 修改 installService.cmd 文件运行 installService.cmd运行 gitblitw.exe查看 services.msc 缘起

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争