Runhouse
Runhouse 允许在不同环境和用户之间进行远程计算和数据交互。请参阅Runhouse文档。
本示例介绍如何使用LangChain和Runhouse与托管在自己的GPU上的模型或在AWS、GCP、AWS或Lambda上的按需GPU进行交互。
注意: 代码中使用SelfHosted
名称代替Runhouse
。
pip install runhouse
from langchain.llms import SelfHostedPipeline, SelfHostedHuggingFaceLLM
from langchain import PromptTemplate, LLMChain
import runhouse as rh
INFO | 2023-04-17 16:47:36,173 | 未提供身份验证令牌,因此不使用RNS API保存和加载配置
# 对于使用GCP、Azure或Lambda的按需A100
gpu = rh.cluster(name="rh-a10x", instance_type="A100:1", use_spot=False)
# 对于使用AWS的按需A10G(AWS上没有单个A100)
# gpu = rh.cluster(name='rh-a10x', instance_type='g5.2xlarge', provider='aws')
# 对于现有集群
# gpu = rh.cluster(ips=['<集群的IP>'],
# ssh_creds={'ssh_user': '...', 'ssh_private_key':'<密钥路径>'},
# name='rh-a10x')
template = """问题:{question}
回答:让我们逐步思考。"""
prompt = PromptTemplate(template=template, input_variables=["question"])
llm = SelfHostedHuggingFaceLLM(
model_id="gpt2", hardware=gpu, model_reqs=["pip:./", "transformers", "torch"]
)
llm_chain = LLMChain(prompt=prompt, llm=llm)
question = "贾斯汀·比伯出生的那一年,哪个NFL球队赢得了超级碗?"
llm_chain.run(question)
INFO | 2023-02-17 05:42:23,537 | 通过gRPC运行_generate_text
INFO | 2023-02-17 05:42:24,016 | 发送消息的时间:0.48秒
"\n\n假设我们正在讨论在贾斯汀·比伯出生的那一年赢得超级碗的体育队"
您还可以通过SelfHostedHuggingFaceLLM接口加载更多自定义模型:
llm = SelfHostedHuggingFaceLLM(
model_id="google/flan-t5-small",
task="text2text-generation",
hardware=gpu,
)
llm("德国的首都是哪里?")
INFO | 2023-02-17 05:54:21,681 | 通过gRPC运行_generate_text
INFO | 2023-02-17 05:54:21,937 | 发送消息的时间:0.25秒
'柏林'
使用自定义加载函数,我们可以直接在远程硬件上加载自定义管道:
def load_pipeline():
from transformers import (
AutoModelForCausalLM,
AutoTokenizer,
pipeline,
) # 需要在笔记本中的函数内部
model_id = "gpt2"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id)
pipe = pipeline(
"text-generation", model=model, tokenizer=tokenizer, max_new_tokens=10
)
return pipe
def inference_fn(pipeline, prompt, stop=None):
return pipeline(prompt)[0]["generated_text"][len(prompt) :]
llm = SelfHostedHuggingFaceLLM(
model_load_fn=load_pipeline, hardware=gpu, inference_fn=inference_fn
)
llm("现任美国总统是谁?")
INFO | 2023-02-17 05:42:59,219 | 通过gRPC运行_generate_text
INFO | 2023-02-17 05:42:59,522 | 发送消息的时间:0.3秒
'约翰·W·布什'
您可以直接将管道发送到模型,但这仅适用于小型模型(<2 GB),而且速度较慢:
pipeline = load_pipeline()
llm = SelfHostedPipeline.from_pipeline(
pipeline=pipeline, hardware=gpu, model_reqs=model_reqs
)
相反,我们还可以将其发送到硬件的文件系统中,这样速度会更快。
rh.blob(pickle.dumps(pipeline), path="models/pipeline.pkl").save().to(
gpu, path="models"
)
llm = SelfHostedPipeline.from_pipeline(pipeline="models/pipeline.pkl", hardware=gpu)