AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


构建 Ollama Cloud - 将本地推理扩展到云端
发布日期:2025-01-24 06:47:07 浏览次数: 1514 来源:AI喵能力
推荐语

这是关于将本地推理扩展到云端的指南,为 AI 开发提供新思路。

核心内容:
1. Ollama 的本地开发设置及优势
2. 从本地到云端的过渡方式与挑战
3. 服务器在扩展中的作用及优势

杨芳贤
53A创始人/腾讯云(TVP)最具价值专家

还在为国内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

WebAssembly (Wasm) 通过将应用程序编译为独立模块来解决依赖项管理难题。这使得应用程序在本地和云端更容易编排和测试,从而确保不同环境中的一致性。

牛头

Tau 是一个用于构建低维护和高可扩展云计算平台的框架。它以简单性和可扩展性著称。Tau 使部署变得简单,并支持运行本地云进行开发,允许对云基础设施及其上运行的应用程序进行端到端 (E2E) 测试。

Taubyte 将这种方法称为“本地编码等于全球生产”,它确保在本地有效的方法可以在全球范围内有效,从而大大简化开发和部署流程。

使用 Orbit 插件系统将 Ollama 集成到 Tau

Tau 的插件系统 Orbit 通过将服务包装到 WebAssembly 主机模块中,大大简化了将服务转变为可管理组件的过程。这种方法允许 Tau 接管编排任务,从而简化部署和管理流程。

Ollama 中的导出函数

为了使 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)
}

为 Ollama 插件编写测试

插件测试过程简单明了。以下是使用 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>





}


最近一些小伙伴和大佬共同组建了一个包含 RAG 和 AGENT 的交流社区,里面有大量的 AnythingLLM 和 Ollama 的大佬一起交流,如果想加入我们的话就扫描下方二维码吧。
往期爆?文章:

Ollama模型管理神器——Gollama(78)
Xorbits Inference:Ollama最强竞品(73)
Ollama可以设置的环境变量(68)


如对您有帮助,别着急?点个“分享 在看”再划走?


53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询