Ollama是一个用于在本地运行大语言模型(LLM)的开源工具,它让开发者和用户能够轻松地在自己的设备上部署和使用大语言模型。

项目地址:https://github.com/ollama/ollama Star数目:129k

核心特性

  1. 简单易用:Ollama提供了简洁的命令行界面,用户可以使用简单的命令来完成模型的下载、运行等操作。例如,使用 ollama run llama2 命令就可以快速启动 Llama 2 模型进行交互。
  2. 多模型支持:支持多种流行的大语言模型,如 Llama 2、Mistral 等。用户可以根据自己的需求选择不同的模型进行使用。
  3. 本地部署:允许将模型下载到本地进行部署和运行,无需依赖云服务。这不仅提高了数据的安全性,还减少了网络延迟,加快了响应速度。
  4. 高效推理:通过优化的推理引擎,能够在本地设备上实现高效的模型推理,充分利用设备的计算资源。
  5. 自定义配置:用户可以对模型的运行参数进行自定义配置,如调整温度、最大生成长度等,以满足不同的应用场景需求。

应用场景

  1. 开发测试:对于开发者来说,Ollama 是一个理想的开发和测试工具。可以在本地环境中快速验证模型的性能和功能,进行算法调试和优化,而无需担心云服务的使用成本和网络问题。
  2. 隐私敏感场景:在处理敏感数据的场景中,如医疗、金融等领域,数据的隐私和安全至关重要。Ollama 的本地部署特性使得数据可以在本地处理,避免了数据传输过程中的泄露风险。
  3. 离线应用:适用于一些没有网络连接或网络不稳定的场景,如野外作业、偏远地区等。用户可以在本地下载好模型,离线使用大语言模型进行文本生成、问答等任务。
  4. 教育学习:对于学生和研究人员来说,Ollama 提供了一个便捷的学习平台。可以通过在本地运行模型,深入了解大语言模型的原理和应用,进行实验和研究。

使用流程

  1. 安装:可以从 Ollama 的官方 GitHub 仓库 下载适合自己操作系统的安装包,按照安装指南进行安装。
  2. 拉取模型:使用 ollama pull 命令从模型库中拉取所需的模型。例如,ollama pull llama2 会下载 Llama 2 模型到本地。
  3. 运行模型:使用 ollama run 命令启动模型进行交互。例如,ollama run llama2 会启动 Llama 2 模型,用户可以在命令行中输入问题,模型会返回相应的回答。
  4. 自定义配置:在运行模型时,可以通过命令行参数对模型的运行参数进行自定义配置。例如,ollama run llama2 --temperature 0.7 --max-tokens 200 可以调整模型的temperature和token最大长度。

依赖子模块

这里仅列出Ollama不通过go.mod导入的子模块。子模块的源代码编译需要依赖于CMake、MinGW、CUDA Toolkit(开启GPU才需要)。

llama.cpp

项目地址:https://github.com/ggml-org/llama.cpp Star数目:75.2k
基于llama.cpp实现的桌面程序、WebUI和服务器很多,其中比较有名有以下几个:

项目名 github地址 Star数目 平台
GPT4All https://github.com/nomic-ai/gpt4all 72.6k Windows、Mac、Linux 桌面程序
Text generation web UI https://github.com/oobabooga/text-generation-webui 42.6k Web UI
LocalAI https://github.com/mudler/LocalAI 30.6k 服务器,功能类似Ollama

源代码分析

主要包含命令行接口(CLI)、客户端API、后端服务器、C++推理核心等几个组件。命令行接口的主程序位于/main.go,主程序调用cmd/cmd.go实现一个命令行程序。

模块层级关系

+---------------------+  +---------------------+
|        cmd          |  |       app           |
| (命令行接口层)    |  |   (托盘程序)      |
|    cmd/cmd.go       |  |   app/main.go       |
+---------------------+  +---------------------+
         |
    +----+----+
    |         |
    v         v
+---------------------+
|      client API     |
| (客户端 API 层)   |
|    api/client.go    |
+---------------------+
         |
         v
+---------------------+
|       server        |
|    (服务器层)     |
|  server/routes.go   |
+---------------------+
         |
         v
+---------------------+
|  C++ 层 Llama 代码  |
| (底层推理核心)    |
|  llama/llama.go     |
+---------------------+

1. 用户交互层 (User Interface Layer)
├── CLI工具 (cmd)
│ ├── 解析用户输入的命令(如`ollama run llama3`)
│ ├── 调用Client API发送HTTP请求到本地Server
│ └── 显示结果(如对话输出或错误信息)
├── WebUI/第三方应用
│ ├── 通过REST API与Ollama Server交互
│ └── 提供图形化界面(如Open WebUI、Raycast插件)

2. API通信层 (API Layer)
├── Client API
│ ├── 提供OpenAI兼容的REST接口(如`/api/generate`)
│ ├── 处理HTTP请求的序列化/反序列化(JSON协议)
│ └── 与Server模块交互(端口11434)

3. 服务管理层 (Service Layer)
├── Server模块
│ ├── 模型生命周期管理
│ │ ├── 下载模型(从Ollama模型库)
│ │ ├── 加载/卸载模型(基于Modelfile配置)
│ │ └── 多模型并发管理(如同时运行Llama3和Gemma)
│ ├── 请求路由与任务调度
│ │ ├── 接收Client API的生成/对话请求
│ │ └── 分配计算资源(CPU/GPU优先级)
│ └── 安全与权限控制
│ ├── 本地访问限制(默认仅允许localhost)
│ └── API密钥验证(可选)

4. 模型执行层 (Model Execution Layer)
├── llama.cpp集成
│ ├── 通过CGO或动态链接调用C++推理代码
│ ├── 执行模型推理(文本生成、Embedding计算)
│ └── 硬件加速优化(如CUDA、Metal支持)
├── 其他推理引擎
│ └── 扩展支持(如兼容GGUF格式的rwkv.cpp)

调用流程示例(以`ollama run llama3`为例)
1. 用户输入命令 → CLI解析并调用API → 发送POST请求到`http://localhost:11434/api/generate\`
2. Server接收请求 → 检查模型状态 → 若未加载则从缓存/仓库加载Llama3模型
3. 调用llama.cpp → 初始化模型权重 → 执行生成任务 → 流式返回Token
4. Server聚合结果 → 通过HTTP响应返回JSON数据 → CLI/WebUI渲染输出

api

客户端API层(主要位于/api/client.go)。ollama 的 http 服务器(即server/routes.go)调用客户端API实现了RESTful API接口。另外命令行程序(详细位于cmd/cmd.go)也是调用客户端API与http服务器进行交互。

client.go主要函数说明

ClientFromEnvironment() 根据环境变量提供的Host地址创建一个客户端
NewClient() 根据参数提供的url创建一个客户端
do() 向服务器发送post/get/head等非流式请求
stream() 向服务器发送流式请求
Pull() POST /api/pull (调用stream()方法向服务器POST请求/api/pull,以下类似,除了调用do()还是stream()方法)
Push POST /api/push
Chat() POST /api/chat
Generate() POST /api/generate
Embed() POST /api/embed
Embeddings() POST /api/embeddings
Create() POST /api/create
Delete() DELETE /api/delete
Copy() POST /api/copy
Show() POST /api/show
ListRunning() GET /api/ps
CreateBlob() POST /api/blobs/:digest
List() GET /api/tags
Heartbeat() HEAD /
Version() GET /api/version

 

app

该目录下的源文件属于应用层。在Windows平台下体现为一个Tray托盘程序。入口函数位于app/main.go源文件。在Windows下面可以查看日志、一健升级(其它平台这两个功能目前都没有实现)。该目录下有一个Inno安装打包脚本文件ollama.iss,用于生成Windows平台下的Ollama安装包。

auth

仅包含一个源文件auth.go,负责公钥与私钥文件的生成、管理操作。

cmd

命令行程序。cmd/cmd.go使用cobra库来处理命令行参数和子命令,各个命令都有对应的处理函数,可提供的命令有:run、stop、serve、list、show、pull、push、create、rm、cp、chat等。每个命令处理函数都是调用了api/client.go向后端服务(server/routes.go)发送请求。

cmd.go主要函数说明

NewCLI() 创建一个命令行处理程序,绑定子命令与其对应的处理函数
RunServer() 处理"serve"命令,创建SSH密钥,调用server/routes.go/Serve函数创建HTTP服务器
PullHandler() 处理"pull MODEL"命令,调用client.Pull请求后端服务
PushHandler() 处理"push MODEL"命令,调用client.Push请求后端服务
RunHandler() 处理"run MODEL [PROMPT]"命令,与模型的交互式会话(调用generateInteractive())或非交互式会话(调用generate()),允许用户输入提示并接收模型的响应。
generate() 非交互式会话,调用client.Generate 请求后端服务
chat() 被interacive.go/generateInteractive()调用,调用client.chat请求后端服务
CreateHandler() 处理"create MODEL"命令,调用client.Create请求后端服务
createBlob() 被CreateHandler()调用,如果解析到Modelfile文件有定义了模型文件,则调用client.CreateBlob请求后端服务。
DeleteHandler() 处理"rm MODEL [MODEL…]"命令,调用client.Delete请求后端服务
CopyHandler() 处理“cp SOURCE DESTINATION”命令,调用client.Copy请求后端服务
ShowHandler() 处理“show MODEL”命令,调用client.Show请求后端服务
ListRunningHandler() 处理“ps”命令,调用client.ListRunning请求后端服务,列出所有正在运行的模型
ListHandler() 处理“list”命令,调用client.List请求后端服务,列出已经下载的模型
StopHandler() 处理“stop MODEL”命令,仅调用loadOrUnloadModel()
versionHandler() 处理“version”命令,调用client.Version请求后端服务
displayResponse() 在终端中显示响应内容。
loadOrUnloadModel() 调用client.Generate请求后端服务,在函数RunHandler、StopHandler、DeleteHandler中都被调用,不知道为何多此一举?

interactive.go主要函数说明

generateInteractive() 调用readline包创建读取器scanner来不断读取用户的输入,并处理多行输入和历史记录,从而实现用户与模型的交互式会话。交互式会话可处理命令/set、/show、/load、/save、/bye、/help。多行模式(即输入回车键)则调用cmd.go/chat()函数处理。

convert

提供模型转换功能。命令ollama create model_name -f modlefile提供将其它模型转换为兼容于Ollama的gguf模型。

reader.go主要函数说明

parseTensors() 解析被转换的模型文件

convert.go主要函数说明

ConvertAdapter() 基于配置文件adapter_config.json解析原模型并写入新的gguf模型
ConvertModel() 基于配置文件config.json解析原模型并写入新的gguf模型
writeFile() 调用llm/gguf.go中的WriteGGUF函数将模型数据写入gguf格式的模型文件

discover

发现系统中的GPU信息,支持CUDA、ROCm和OneAPI三种GPU架构。

核心函数由C语言代码实现,使用cgo实现了混合编程。

gpu.go主要函数说明

initCudaHandles() 根据不同平台下的cuda动态库名称查找本地GPU驱动程序。
GetGPUInfo() 调用本地GPU驱动程序获取GPU信息。
loadCUDARTMgmt() 根据CUDA动态库路径加载CUDA运行时库并初始化CUDA环境,返回指向CUDA运行时句柄的指针用于后续的CUDA操作。

docs

包含所有的Markdown文档文件。

envconfig

仅包含一个源文件config.go。用于处理环境变量的读写操作。

format

工具包函数,包含bytes、time和格式化等操作的实现。

fs

主要模型文件类型gguf、ggml的结构定义。文件读写工具函数的实现。

integration

提供所有的测试用例。

kvcache

KV张量缓存层,为处理序列数据提供了高效的检索和更新操作,同时维护数据的顺序信息。

llama

集成llama.cpp模块的底层推理核心。实现 Llama 模型的具体推理逻辑,是整个系统的底层核心。它负责加载模型、处理输入数据、进行推理计算并返回结果。

调用方式:源文件llama/llama.go通过CGO封装llama.cpp模块,所提供的接口用于 runner/llamarunner/runner.go/server 调用。在版本ollama 0.5.7版本之前,runner/server 通过http api 请求将输入数据传递给C++层的http 服务器来完成推理并返回推理结果(ollama 0.5.7在安装目录下面有一个ollama_llama_server.exe的程序)。

后端推理服务的变化
在ollama v0.3.14版本及之前,由C++层的代码(位于 llm/ext_server.cpp)实现一个http服务器,并编译为一个名为ollama_llama_server.exe的程序。该程序主要提供以下四个RESTful API接口:

  • /completion
  • /tokenize
  • /detokenize
  • /embedding
  • /health

从ollama v0.4.0版本开始,C++层http服务器的源文件llm/ext_server.cpp被删除,并交由go代码(位于llama/runner/runner.go)通过cgo接口调用llama.cpp模块的方式实现该http服务器,它提供了如下RESTful API 接口:

  • /completion
  • /embedding
  • /health

llama.go主要函数说明

该源代码文件主要是使用CGO来重新封装llama.cpp模块(C++层代码)来提供给外部函数调用。

BackendInit() cgo封装llama_backend_init实现llama.cpp模块初始化
LoadModelFromFile() cgo封装llama_load_model_from_file,从指定路径中加载模型
NewContextWithModel() 根据模型加载上下文Context
Tokenize() cgo封装llama_tokenize实现分词
Quantzie() cgo封装llama_model_quantize实现量化
TokenToPiece() cgo封装llama_token_to_piece实现token转换为文本
GetEmbeddingsSeq() cgo封装llama_n_embd获取embed
Decode() cgo封装llama_decode实现解码
Sample() cgo封装common_sampler_csample实现采样

llm

gguf、ggml模型结构定义和数据处理。通过http请求与外部llama服务进程(由server/routes.go的Serve()函数启动)通信,从而实现文本生成、embed、tokenize、反tokenize等任务。

gguf.go主要函数说明

Decode() 从io.ReadSeeker读取并解析GGUF数据
WriteGGUF() 将键值和张量列表写入到io.WriteSeeker用于创建GGUF格式的数据。

ggml.go主要函数说明

DetectGGMLType() 根据文件前4个字节检测GGML文件的类型
DecodeGGML() 从给定的读取器io.ReadSeeker中解码GGML模型

server.go主要函数说明

与外部进程(C++编写的llama模型服务)进行交互,以执行文本生成、embed、tokenize、反tokenize等任务。

LoadModel() 从磁盘加载GGML格式的模型
NewLlamaServer() 使用命令ollama runner启动外部llama服务进程(即模型所对应的一个http服务器)
Completion() 发送文本补全(生成)请求并处理响应,通过http请求与外部llama服务进程通信
Embedding() 获取文本的embed表示,通过http请求与外部llama服务进程通信
tokenize() 文本分词,通过http请求与外部llama服务进程通信
Detokenize() 文本反分词,通过http请求与外部llama服务进程通信

macapp

提供一个Web UI程序,用TypeScript语言编写。详细编译操作可查看同目录下的README.md文件。

ml

底层后端的实现,通过cgo使用ggml张量库实现模型推理,包括cuda、metal、hip等相关的底层操作。一个Backend负责加载预训练模型到GPU或CPU,为模型提供接口访问张量数据和张量运算。该部分的代码从ollama 0.5.11开始加入,仍然在完善当中。

model

mllama、pixtral、qwen2vl的图像预处理,主要是大小调整、填充、分割和归一化处理。模型结构的定义。

openai

仅包含一个源文件openai.go。提供兼容于OpenAI REST API的中间件。主要是定义与构建兼容于OpenAI API的数据结构。

parser

模型文件modelfile的解析。仅包含一个源文件parser.go。主要负责解析modelfile文件并将它转换为程序可以处理的数据结构。

progress

展示进度条信息,如文件上传和下载进度(对应push、pull命令)。包含三个源文件bar.go、progress.go、spinner.go。

readline

在交互式响应中读取控制台输入,并处理多行输入和历史记录,被 cmd/interactive.go调用

runners

主要用于定位和管理不同硬件加速能力的运行器(runners)。每个runner实质是一个模型所对应的一个http服务器,监听/completion和/embedding的路由请求。

当ollama serve启动时由server/routes.go的Http Server创建一个调度器Scheduler(在server/sched.go中定义),Scheduler用一个map结构存放每个模型所对应的runner(即loaded map[string]*runnerRef)。调度器每次调用Scheduler.load()函数时都会调用llm.NewLlamaServer()创建llm.llmServer(位于llm/server.go),由llm.NewLlamaServer()执行cli命令“ollama runner”来创建一个http服务器(即runner/ollamarunner/runner.go/server)用于具体处理每个模型所需要的completion或embedding等服务请求。

// server/routes.go
type Server struct {
    addr  net.Addr
    sched *Scheduler
}

// serer/sched.go
type Scheduler struct {
    loaded   map[string]*runnerRef
}

// serer/sched.go
type runnerRef struct {
    llama       llm.LlamaServer
    model       *Model
    modelPath   string
}

// llm/server.go
type LlamaServer interface {
    Ping(ctx context.Context) error
    WaitUntilRunning(ctx context.Context) error
    Completion(ctx context.Context, req CompletionRequest, fn func(CompletionResponse)) error
    Embedding(ctx context.Context, input string) ([]float32, error)
    Tokenize(ctx context.Context, content string) ([]int, error)
    Detokenize(ctx context.Context, tokens []int) (string, error)
}

// runner/llamarunner/runner.go
func Execute() {
    mux := http.NewServeMux()
    mux.HandleFunc("/embedding", server.embeddings)
    mux.HandleFunc("/completion", server.completion)
    mux.HandleFunc("/health", server.health)
}

runner/ollamarunner/runner.go主要函数说明

每当调用一个ollama run命令就执行一次runner.Execute()来创建一个http 服务器监听本地请求。

Execute() 负责解析命令行参数,初始化服务器和模型,并启动HTTP服务器。分别使用一个协程来执行loadModel()来加载模型和run()服务器主循环。
loadModel() 加载模型文件,被Execute()以协程的方式调用
run() 主循环,被Execute()以协程的方式调用
processBatch() 在主循环中调用,调用C函数批量处理输入token和embed队列
NewSequence() 向C函数输入prompt和image数据,生成token和embed队列
completion() POST /completion 路由所对应的处理器
embeddings() POST /embedding 路由所对应的处理器
health() HEAD /health 路由所对应的处理器

ruuner.go的代码实现过程可以参考llama.cpp实现chat的流程:

std::string chat(std::string model_path, std::string prompt) {
    llama_backend_init();

    // 配置模型参数和加载模型文件
    llama_model_params model_params = llama_model_default_params();
    llama_model model = llama_model_load_from_file(model_path, model_params);

    // 获取词汇表
    const llama_vocab vocab = llama_model_get_vocab(model);

    // 初始化llama context参数
    llama_context_params ctx_params = llama_context_default_params();
    llama_context ctx = llama_init_from_model(model, ctx_params);

    // 初始化采样器
    llama_sampler smpl = llama_sampler_chain_init(llama_sampler_chain_default_params());

    // token列表,int数据类型
    std::vector<llama_token> tokens;
    llama_tokenize(vocab, prompt.c_str(), prompt.size(), tokens.data(), tokens.size(), is_first, true);

    // 为prompt准备一个batch
    llama_batch batch = llama_batch_get_one(tokens.data(), tokens.size());

    std::string response;
    while(true)
    {
        llama_decode(ctx, batch);

        // 采样下一个token
        new_token_id = llama_sampler_sample(smpl, ctx, -1);

        // 将token转换为文本
        char buf[256];
        int n = llama_token_to_piece(vocab, new_token_id, buf, sizeof(buf), 0, true);
        std::string piece(buf, n);
        response += piece;

        // 用采样的token准备下一个batch
        batch = llama_batch_get_one(&new_token_id, 1);        
    }

    return response;
}

sample

采样策略(如softmax、TopK、TopP、MinP)的实现,不过目前具体实现尚为空。Temperature和weighted提供了具体的采样逻辑,分别实现了简单的缩放和加权随机采样。

scripts

包含所有的sh脚本文件,主要用于编译、docker构建、安装、发布。

server

在整个框架中处于服务器层。主要是后端服务器的实现,提供服务器http路由,模型文件管理,包括创建、下载、上传。镜像文件和镜像层操作。当涉及到模型推理时,server 会调用 C++ 层的 Llama 代码来完成具体的推理任务,然后将推理结果返回给 client API

routes.go主要函数说明

路由操作,处理不同类型的API请求。

GenerateRoutes() 将路由路径与处理函数进行绑定,由处理器XXXHandler()处理不同的路由请求
PullHandler() POST /api/pull (客户端路由请求 POST /api/pull 时调用该处理器)
PushHandler() POST /api/push
GenerateHandler() POST /api/generate POST /v1/completions
ChatHandler() POST /api/chat POST /v1/chat/completions
EmbedHandler() POST /api/embed POST /v1/embeddings
EmbeddingsHandler() POST /api/embeddings
CreateHandler() POST /api/create
DeleteHandler() DELETE /api/delete
CopyHandler() POST /api/copy
ShowHandler() POST /api/show GET /v1/models/:model
PsHandler() GET /api/ps
CreateBlobHandler() POST /api/blobs/:digest
HeadBlobHandler() HEAD /api/blobs/:digest
ListHandler() GET /v1/models GET /api/tags HEAD /api/tags

template

模板处理包,主要用于加载、解析和执行预定义的文本模板。仅包含一个源文件template.go

types

类型数据的定义与解析。主要包含types/model/name.go。

version

程序版本号

Ollama结构体

ollama/server/manifest.go

type Manifest struct {
    SchemaVersion int     `json:"schemaVersion"`
    MediaType     string  `json:"mediaType"`
    Config        Layer   `json:"config"`
    Layers        []Layer `json:"layers"`

    filepath string
    fi       os.FileInfo
    digest   string
}

ollama/server/layer.go

type Layer struct {
    MediaType string `json:"mediaType"`
    Digest    string `json:"digest"`
    Size      int64  `json:"size"`
    From      string `json:"from,omitempty"`
    status    string
}

示例

C:\Users\Administrator\.ollama\models\manifests\registry.ollama.ai\library\codellama\latest

{
  "schemaVersion": 2,
  "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
  "config": {
    "mediaType": "application/vnd.docker.container.image.v1+json",
    "digest": "sha256:316526ac7323d6f42305c5bbf1939e1197487c1e6ea1f01292ceb5e3040b707a",
    "size": 529
  },
  "layers": [
    {
      "mediaType": "application/vnd.ollama.image.model",
      "digest": "sha256:3a43f93b78ec50f7c4e4dc8bd1cb3fff5a900e7d574c51a6f7495e48486e0dac",
      "size": 3825898144
    },
    {
      "mediaType": "application/vnd.ollama.image.license",
      "digest": "sha256:8c17c2ebb0ea011be9981cc3922db8ca8fa61e828c5d3f44cb6ae342bf80460b",
      "size": 7020
    },
    {
      "mediaType": "application/vnd.ollama.image.license",
      "digest": "sha256:590d74a5569b8a20eb2a8b0aa869d1d1d3faf6a7fdda1955ae827073c7f502fc",
      "size": 4790
    },
    {
      "mediaType": "application/vnd.ollama.image.template",
      "digest": "sha256:2e0493f67d0c8c9c68a8aeacdf6a38a2151cb3c4c1d42accf296e19810527988",
      "size": 59
    },
    {
      "mediaType": "application/vnd.ollama.image.params",
      "digest": "sha256:7f6a57943a88ef021326428676fe749d38e82448a858433f41dae5e05ac39963",
      "size": 120
    }
  ]
}

ollama/server/images.go

type ConfigV2 struct {
    ModelFormat   string   `json:"model_format"`
    ModelFamily   string   `json:"model_family"`
    ModelFamilies []string `json:"model_families"`
    ModelType     string   `json:"model_type"`
    FileType      string   `json:"file_type"`

    // required by spec
    Architecture string `json:"architecture"`
    OS           string `json:"os"`
    RootFS       RootFS `json:"rootfs"`
}

type RootFS struct {
    Type    string   `json:"type"`
    DiffIDs []string `json:"diff_ids"`
}

示例

C:\Users\Administrator\.ollama\models\blobs\sha256-316526ac7323d6f42305c5bbf1939e1197487c1e6ea1f01292ceb5e3040b707a

{
  "model_format": "gguf",
  "model_family": "llama",
  "model_type": "7B",
  "file_type": "Q4_0",
  "rootfs": {
    "type": "layers",
    "diff_ids": [
      "sha256:3a43f93b78ec50f7c4e4dc8bd1cb3fff5a900e7d574c51a6f7495e48486e0dac",
      "sha256:8c17c2ebb0ea011be9981cc3922db8ca8fa61e828c5d3f44cb6ae342bf80460b",
      "sha256:590d74a5569b8a20eb2a8b0aa869d1d1d3faf6a7fdda1955ae827073c7f502fc",
      "sha256:2e0493f67d0c8c9c68a8aeacdf6a38a2151cb3c4c1d42accf296e19810527988",
      "sha256:7f6a57943a88ef021326428676fe749d38e82448a858433f41dae5e05ac39963"
    ]
  },
  "architecture": "amd64",
  "os": "linux"
}
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐