微信扫码
与创始人交个朋友
我要投稿
这是关于将本地推理扩展到云端的指南,为 AI 开发提供新思路。核心内容:1. Ollama 的本地开发设置及优势2. 从本地到云端的过渡方式与挑战3. 服务器在扩展中的作用及优势
还在为国内AI的良莠不齐,效果不好而烦恼吗?
那么一起来看看 开发喵AI(3in1) 吧
这是一个整合了 GPT-4、Claude3、Gemini 三位一体的集成化AI助手
覆盖了三个AI工具的所有模型
包括 GPT-4o 和 Gemini flash
现仅需 ¥68 就可以将它们拥为己用
官网价值 ¥420+
后台发送“开发喵”开启使用
此刻成为会员还可享受一对一私人服务,给您的使用保驾护航
Ollama 主要是一个包装器llama.cpp
,专为本地推理任务而设计。如果你正在寻找尖端的性能或功能,它通常不是你的首选,但它有其用途,特别是在需要关注外部依赖关系的环境中。
使用 Ollama 进行本地 AI 开发时,设置简单但有效。开发人员通常利用 Ollama 直接在本地机器上运行推理任务。以下是使用 Ollama 的典型本地开发设置的直观描述:
此配置允许开发人员快速测试和迭代,而无需复杂的远程服务器通信。它非常适合初始原型设计和开发阶段,因为快速周转至关重要。
从本地设置过渡到可扩展的云环境需要从简单的 1:1 设置(一个用户请求到一个推理主机)演变为更复杂的多对多(多个用户请求到多个推理主机)配置。随着需求的增加,这种转变对于保持效率和响应能力是必不可少的。
从本地开发到生产时的扩展方式如下:
在此过渡期间采用直接方法可能会显著增加应用程序的复杂性,尤其是当会话需要在各种状态下保持一致性时。如果请求没有以最佳方式路由到最佳可用推理主机,则可能会出现延迟和效率低下的情况。
此外,分布式应用程序的复杂性使其难以在本地进行测试,这可能会减慢开发过程并增加生产环境中出现故障的风险。
服务器计算抽象了服务器管理和基础架构细节,使开发人员可以专注于代码和业务逻辑。通过将请求处理和一致性维护与应用程序分离,无服务器架构简化了扩展。
这种方法使应用程序能够专注于提供价值,解决许多常见的扩展挑战,而不会给开发人员带来基础设施复杂性的负担。
WebAssembly (Wasm) 通过将应用程序编译为独立模块来解决依赖项管理难题。这使得应用程序在本地和云端更容易编排和测试,从而确保不同环境中的一致性。
Tau 是一个用于构建低维护和高可扩展云计算平台的框架。它以简单性和可扩展性著称。Tau 使部署变得简单,并支持运行本地云进行开发,允许对云基础设施及其上运行的应用程序进行端到端 (E2E) 测试。
Taubyte 将这种方法称为“本地编码等于全球生产”,它确保在本地有效的方法可以在全球范围内有效,从而大大简化开发和部署流程。
Tau 的插件系统 Orbit 通过将服务包装到 WebAssembly 主机模块中,大大简化了将服务转变为可管理组件的过程。这种方法允许 Tau 接管编排任务,从而简化部署和管理流程。
为了使 Ollama 功能在 Tau 生态系统中可用,我们利用 Orbit 系统将 Ollama 的功能导出为可调用端点。以下是在 Go 中导出端点的方法:
func (s *ollama) W_pull(ctx context.Context, module satellite.Module, modelNamePtr uint32, modelNameSize uint32, pullIdptr uint32) Error {
model, err := module.ReadString(modelNamePtr, modelNameSize)
if err != nil {
return ErrorReadMemory
}
id, updateFunc := s.getPullId(model)
if updateFunc != nil {
go func() {
err = server.PullModel(s.ctx, model, &server.RegistryOptions{}, updateFunc)
s.pullLock.Lock()
defer s.pullLock.Unlock()
s.pulls[id].err = err
}()
}
module.WriteUint64(pullIdptr, id)
return ErrorNone
}
一旦定义,这些函数(现在称为 via satellite.Export
)就可以将 Ollama 无缝集成到 Tau 的环境中:
func main() {
server := new(context.TODO(), "/tmp/ollama-wasm")
server.init()
satellite.Export("ollama", server)
}
插件测试过程简单明了。以下是使用 Go 编写无服务器函数测试的方法:
//export pull
func pull() {
var id uint64
err := Pull("gemma:2b-instruct", &id)
if err != 0 {
panic("failed to call pull")
}
}
使用 Tau 的测试套件和 Go 构建器工具,你可以构建插件、将其部署在测试环境中并执行无服务器功能来验证功能:
func TestPull(t *testing.T) {
ctx := context.Background()
<span class="c">// Create a testing suite to test the plugin</span>
<span class="n">ts</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">suite</span><span class="o">.</span><span class="n">New</span><span class="p">(</span><span class="n">ctx</span><span class="p">)</span>
<span class="n">assert</span><span class="o">.</span><span class="n">NilError</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
<span class="c">// Use a Go builder to build plugins and wasm</span>
<span class="n">gob</span> <span class="o">:=</span> <span class="n">builder</span><span class="o">.</span><span class="n">New</span><span class="p">()</span>
<span class="c">// Build the plugin from the directory</span>
<span class="n">wd</span><span class="p">,</span> <span class="n">_</span> <span class="o">:=</span> <span class="n">os</span><span class="o">.</span><span class="n">Getwd</span><span class="p">()</span>
<span class="n">pluginPath</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">gob</span><span class="o">.</span><span class="n">Plugin</span><span class="p">(</span><span class="n">path</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">wd</span><span class="p">,</span> <span class="s">"."</span><span class="p">),</span> <span class="s">"ollama"</span><span class="p">)</span>
<span class="n">assert</span><span class="o">.</span><span class="n">NilError</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
<span class="c">// Attach plugin to the testing suite</span>
<span class="n">err</span> <span class="o">=</span> <span class="n">ts</span><span class="o">.</span><span class="n">AttachPluginFromPath</span><span class="p">(</span><span class="n">pluginPath</span><span class="p">)</span>
<span class="n">assert</span><span class="o">.</span><span class="n">NilError</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
<span class="c">// Build a wasm file from serverless function</span>
<span class="n">wasmPath</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">gob</span><span class="o">.</span><span class="n">Wasm</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">path</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">wd</span><span class="p">,</span> <span class="s">"fixtures"</span><span class="p">,</span> <span class="s">"pull.go"</span><span class="p">),</span> <span class="n">path</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">wd</span><span class="p">,</span> <span class="s">"fixtures"</span><span class="p">,</span> <span class="s">"common.go"</span><span class="p">))</span>
<span class="n">assert</span><span class="o">.</span><span class="n">NilError</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
<span class="c">// Load the wasm module and call the function</span>
<span class="n">module</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">ts</span><span class="o">.</span><span class="n">WasmModule</span><span class="p">(</span><span class="n">wasmPath</span><span class="p">)</span>
<span class="n">assert</span><span class="o">.</span><span class="n">NilError</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
<span class="c">// Call the "pull" function from our wasm module</span>
<span class="n">_</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="n">module</span><span class="o">.</span><span class="n">Call</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="s">"pull"</span><span class="p">)</span>
<span class="n">assert</span><span class="o">.</span><span class="n">NilError</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
}
如对您有帮助,别着急?点个“分享 在看”再划走?
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-01-24
谁说AI Agent杀死了RPA,UiPath第一个不服!来自头部RPA应用CEO Daniel Dines的深刻洞察
2025-01-24
领域大模型修炼手册—从训练、评测到应用搭建
2025-01-24
Opal 机器学习平台:爱奇艺数智一体化实践
2025-01-24
爱奇艺 Opal 机器学习平台:特征中心建设实践
2025-01-23
DeepSeekV3如何一次性预测多个token
2025-01-23
LLM之后,Agent的未来是RL!
2025-01-23
Lex Fridman 对话 Cursor 团队:AI 如何重塑编程的未来
2025-01-22
“满屏”的Perplexity,5人小团队为何还要做一款AI搜索引擎?|对话创始人
2024-09-18
2024-07-11
2024-07-11
2024-07-26
2024-07-09
2024-06-11
2024-10-20
2024-07-20
2024-07-12
2024-09-02