5分钟搭建个人模型仓库:用Replicate实现模型即服务

发布时间:2026/6/14 6:13:14
5分钟搭建个人模型仓库:用Replicate实现模型即服务 1. 项目概述为什么一个“5分钟搭建的个人模型仓库”值得你停下来看完这一页Replicate 这个名字最近两年在机器学习工程圈子里出现的频率已经不亚于 Docker 或 GitHub。它不是另一个训练框架也不是什么新出的云平台而是一个极简主义的模型部署与分发协议——你可以把它理解成“模型界的 npm”只不过它打包的不是 JavaScript 函数而是 PyTorch 模型权重、推理脚本、环境依赖和一行可复现的replicate run命令。而标题里说的“Build a Personal ML Model Registry with Replicate in 5 mins”绝不是营销话术里的“5分钟上手”而是实打实的、从零到可运行、可版本化、可分享的个人模型仓库全程不碰服务器、不配 Dockerfile、不写 API 网关只用 Replicate CLI 一个 GitHub 仓库 你本地已有的 Python 环境就能完成。我第一次用它上线自己微调的 Stable Diffusion LoRA 模型时整个流程是这样的改好predict.py写好replicate.yamlreplicate deploy一敲37秒后拿到一个形如r8_abc123xyz/model:latest的全局唯一模型标识符然后直接在任何终端里输入replicate run r8_abc123xyz/model:latest --input prompta cyberpunk cat wearing neon sunglasses结果就回来了。没有 Flask、没有 FastAPI、没有 Nginx 反向代理、没有证书配置——连requirements.txt都不用手动维护Replicate 会自动解析你的predict.py依赖并构建隔离环境。这种“模型即服务”的轻量级交付范式正在快速替代我们过去习惯的“先搭 API再写文档再配监控”的重型 MLOps 流水线尤其适合独立开发者、研究者、课程助教、甚至想给非技术同事快速演示模型能力的产品经理。这个“个人模型仓库”本质是你对模型资产的主权声明它不托管在某个大厂控制的模型中心里也不依赖你自己的 GPU 服务器 24 小时在线它由你完全控制源码GitHub、完全控制版本Git tag Replicate model version、完全控制访问权限私有模型默认仅你可见更重要的是它天然支持模型复现性——别人只要拿到你的replicate.yaml和 Git commit hash就能在本地一键重建完全一致的推理环境。这不是玩具而是我在给高校实验室做模型共享平台时最终放弃自建 FastAPI MLflow 方案、转而全线迁移到 Replicate 的核心原因省下的不是时间而是心智带宽。下面我们就从零开始把这套机制拆解清楚每一步都告诉你“为什么这么设计”、“踩过什么坑”、“换种方式行不行”。2. 整体架构与设计逻辑为什么 Replicate 是当前最适配“个人模型仓库”的技术选型2.1 不是“又一个模型托管平台”而是“模型交付协议”的重新定义要真正理解这个项目的底层价值得先跳出“我要找个地方存模型”的思维定式。传统模型仓库比如 Hugging Face Hub、TensorFlow Hub解决的是“发现”和“下载”问题你上传一个.pt文件别人可以git lfs pull或torch.hub.load下来但接下来呢怎么跑需要什么 Python 版本CUDA 版本哪些 pip 包输入格式长什么样有没有预处理/后处理逻辑这些信息散落在 README、notebook、甚至作者的微信聊天记录里。而 Replicate 的核心创新在于它把“模型”重新定义为一个可执行单元executable unit而非静态文件。这个单元由三部分刚性绑定代码层predict.py—— 必须实现Predictor类包含setup()加载权重和predict()接收输入、返回输出两个方法配置层replicate.yaml—— 声明该模型的输入参数类型string,int,float,bool,file、默认值、描述、GPU 需求cuda:11.8orcpu、Python 版本、以及最重要的——所有依赖项的精确来源pip、conda、githttps、甚至本地路径环境层由 Replicate 平台根据replicate.yaml自动构建的 Docker 镜像 —— 它不是通用基础镜像而是为你这个模型量身定制的、包含所有依赖、预装 CUDA 驱动、且经过安全扫描的最小化运行时。提示Replicate 构建的镜像不包含你本地的.git目录或__pycache__也不会打包node_modules或venv它只打包replicate.yaml显式声明的文件和依赖。这意味着你无法在predict.py里偷偷读取同目录下未声明的config.json——这是强制你把所有模型行为显式契约化的机制。这种“代码配置环境三位一体”的交付模式直接消除了 MLOps 中最耗时的“环境一致性”问题。我曾帮一个医疗 AI 团队排查线上推理失败问题折腾了三天才发现是他们本地测试用的torch2.0.1cu117和服务器上torch2.0.1CPU 版不兼容。换成 Replicate 后同样的模型replicate run命令在本地、CI、生产环境返回的结果哈希值完全一致——因为根本就没有“本地 vs 服务器”之分只有“Replicate 构建的镜像”这一个事实。2.2 为什么是“个人”仓库它的边界在哪里标题强调“Personal”这非常关键。Replicate 的免费 tier 对个人开发者极其友好每月 1000 次免费推理调用足够日常调试和小范围分享无限次模型部署deploy无限私有模型private models且所有模型版本永久存档unlike some platforms that prune old versions。这意味着你可以把自己微调的 Whisper 语音识别模型封装成yourname/whisper-small-zh:latest让实习生用一行命令调用把课程作业里写的图像超分模型yourname/sr-resnet-pytorch:v1.2打上 Git tag作为作业提交物把实验中不同 loss 函数训练出的 5 个变体分别部署为yourname/my-model:loss-l1,:loss-l2,:loss-perceptual等用 Git 分支管理实验谱系。但它不是一个企业级模型治理平台。它不提供 RBAC基于角色的访问控制、不支持 SSO 登录集成、不内置模型性能监控latency/throughput/metrics、不支持 A/B 测试流量切分。如果你的团队需要审批流、审计日志、SLA 保障那 Replicate 应该作为你模型交付的“最后一公里”前面仍需搭配 MLflow 或 Weights Biases 做实验追踪。但对于单人、小团队、教学场景“个人”恰恰是它的优势——没有组织架构束缚没有审批流程没有额外运维成本模型从 idea 到可分享真的就是 5 分钟。2.3 与同类方案的硬核对比为什么不是 Hugging Face Spaces 或 Gradio很多人第一反应是“我用 Hugging Face Spaces 不也是一键部署” 是的但 Spaces 的定位是“交互式演示”它的底层是托管一个 Gradio 或 Streamlit 应用核心价值在于 UI。而 Replicate 的定位是“无头 API”核心价值在于可编程性。对比一下实际使用场景维度ReplicateHugging Face Spaces自建 FastAPI调用方式replicate run r8_xyz/model:latest --input prompt...终端命令curl -X POST https://api.replicate.com/v1/predictionsHTTP APIgradio_client.predict(...)Python SDK或打开浏览器 URLrequests.post(http://localhost:8000/predict, json{...})输入/输出结构化强制在replicate.yaml中定义 schemaCLI 自动校验类型、必填项、默认值Gradio 组件决定输入输出但 schema 不暴露为机器可读格式完全自由但需手动写 Pydantic Model、OpenAPI 文档版本控制粒度每次replicate deploy生成唯一 model version ID如r8_xyz/model:5c37e...Git commit hash 内置Spaces 关联一个 Git branch但 branch 更新不自动触发 rebuild需手动点击 “Rebuild”依赖 CI/CD 流程版本号需人工管理如 Docker tag冷启动延迟首次调用约 10-20 秒拉取镜像初始化后续请求 500ms首次访问约 15-30 秒启动容器加载模型后续保持 warm可预热但需自行管理实例生命周期最关键的区别在于Spaces 是给人用的Replicate 是给程序用的。当你需要把模型嵌入到自动化 pipeline比如用模型处理每天爬取的 1000 条新闻标题并存入数据库Replicate 的 CLI 和 HTTP API 天然契合而 Spaces 的 Gradio UI 在这种场景下毫无意义反而增加不必要的网络跳转和状态管理复杂度。3. 核心细节解析与实操要点从零开始搭建你的第一个模型仓库3.1 前置准备三个必须确认的本地环境条件别急着敲命令先花 2 分钟确认这三点能避免 90% 的首次部署失败Python 版本必须 ≥3.8 且 ≤3.11Replicate 官方明确不支持 Python 3.12截至 2024 年中因为其底层构建系统依赖的某些 C 扩展尚未适配。我试过强行用 3.12replicate deploy会卡在Building wheel for torch步骤长达 15 分钟然后报错。解决方案很简单用pyenv创建一个 3.10 环境pyenv install 3.10.12 pyenv local 3.10.12 python --version # 确认输出 3.10.12Git 仓库必须已初始化且至少有一个 commitReplicate 的部署过程会读取当前目录的.git信息并将git remote get-url origin作为模型元数据的一部分用于溯源。如果你只是在一个空文件夹里操作replicate deploy会报错Error: Not in a git repository。哪怕你暂时不打算 push 到 GitHub也请执行git init git add . git commit -m init model repo注意Replicate 不会自动 push 你的代码到远程它只读取本地 Git 状态。所以你可以先本地开发等模型稳定后再git push。Replicate CLI 必须登录且 Token 有效安装 CLI 很简单pip install replicate。但登录这一步常被忽略。运行replicate login会打开浏览器让你授权。授权后CLI 会在~/.replicate/credentials写入一个 token。关键点来了这个 token 默认有效期是 30 天且不会自动刷新。如果你一个月没用再次replicate deploy会报Authentication failed。我的经验是每次开始新项目前先执行replicate whoami如果返回You are not logged in立刻重登。另外token 文件权限必须是600仅 owner 可读写否则 CLI 会拒绝读取——这是 Replicate 的安全设计防止 token 泄露。3.2replicate.yaml模型的“宪法”每一行都决定命运这是整个项目的心脏文件它决定了你的模型能否被正确构建、能否被正确调用、能否被他人复现。我们以一个极简的文本分类模型为例逐行解析# replicate.yaml name: text-classifier description: A lightweight BERT-based text classifier for sentiment analysis visibility: private # 可选 public/private默认 private # 输入参数定义 —— 这是用户调用时看到的 interface # 每个 input 必须有 type, default (可选), description inputs: text: type: string default: I love this product! description: The input text to classify threshold: type: float default: 0.5 description: Confidence threshold for positive class # 输出定义 —— 告诉 Replicate 返回什么结构 # type 必须是 string, int, float, bool, file, 或 array of these output: type: object properties: label: type: string description: Predicted class: positive or negative confidence: type: float description: Models confidence score between 0 and 1 # 运行时环境配置 environment: python_version: 3.10 # 必须与你本地一致 cuda_version: 11.8 # 如果用 GPU必须指定CPU 模型可删此行 # 依赖管理 —— 这里是精髓 # pip 依赖会自动安装conda 不支持git 依赖必须是 public repo predictions: - type: python file: predict.py requirements: - transformers4.38.2 - torch2.0.1cu118 # 注意cu118 表示 CUDA 版本必须匹配 environment.cuda_version - githttps://github.com/huggingface/transformers.gitv4.38.2 # 可指定 git commit为什么requirements里要写torch2.0.1cu118而不是torch2.0.0因为 Replicate 的构建系统会严格按字面量安装。如果你写torch2.0.0它可能装torch2.1.0cu118而你的predict.py里用了torch.compile()2.1 新增但在environment.cuda_version: 11.8下torch2.1.0cu118实际上并不提供torch.compile的 CUDA 支持它需要 cu12.x。结果就是模型构建成功但首次replicate run时在predict()里报AttributeError: module torch has no attribute compile。我踩过这个坑花了 2 小时 debug最后发现是版本不匹配。教训永远用锁死版本且确保cuXXX后缀与cuda_version完全一致。3.3predict.py模型的“大脑”必须遵循的铁律Replicate 强制要求predict.py实现一个Predictor类且必须包含setup()和predict()两个方法。这是它的契约不能妥协# predict.py from typing import Dict, Any import torch from transformers import AutoTokenizer, AutoModelForSequenceClassification from transformers import pipeline class Predictor: def __init__(self): self.model None self.tokenizer None self.classifier None def setup(self) - None: 此方法在模型首次加载时执行一次用于初始化加载权重、构建 pipeline # 关键必须用 torch.no_grad()否则 GPU 显存会泄漏 with torch.no_grad(): self.tokenizer AutoTokenizer.from_pretrained(distilbert-base-uncased-finetuned-sst-2-english) self.model AutoModelForSequenceClassification.from_pretrained( distilbert-base-uncased-finetuned-sst-2-english ) # pipeline 是 transformers 推荐的轻量级封装比 raw model 更鲁棒 self.classifier pipeline( sentiment-analysis, modelself.model, tokenizerself.tokenizer, device0 if torch.cuda.is_available() else -1 ) def predict(self, text: str, threshold: float 0.5) - Dict[str, Any]: 此方法每次调用时执行接收 inputs 定义的参数返回 output 定义的结构 # 输入校验可选但强烈推荐 if not isinstance(text, str) or len(text.strip()) 0: raise ValueError(Input text must be a non-empty string) # 执行推理 result self.classifier(text)[0] # pipeline 返回 list of dict label result[label].lower() # e.g., POSITIVE - positive confidence float(result[score]) # 根据 threshold 逻辑后处理业务逻辑在此体现 if label positive and confidence threshold: label neutral elif label negative and confidence threshold: label neutral return { label: label, confidence: confidence }必须遵守的三条铁律setup()里禁止任何 I/O 操作如读取外部文件、网络请求Replicate 的构建阶段会执行setup()来验证环境但此时网络可能不可达且构建镜像时外部文件路径不存在。所有权重必须通过from_pretrained()从 Hugging Face Hub 下载Hub 是 Replicate 白名单 CDN或放在项目目录下并显式声明在replicate.yaml的files字段中。predict()方法签名必须与replicate.yaml的inputs完全一致如果yaml里定义了threshold: float那么predict()的参数就必须是threshold: float不能是threshold: Optional[float] None。Replicate 的 CLI 会根据yaml生成调用参数类型不匹配直接报错。返回值必须是 JSON-serializable 的原生 Python 类型return {label: label, confidence: confidence}没问题但return {tensor: torch.tensor([1,2,3])}会失败因为torch.Tensor不可 JSON 序列化。Replicate 会捕获异常并返回{error: Output is not JSON serializable}。解决方案所有 tensor 必须.item()或.tolist()转为原生类型。4. 实操过程与核心环节实现5 分钟倒计时开始4.1 第 1 分钟初始化项目结构与基础文件打开终端创建一个新目录进入mkdir my-text-classifier cd my-text-classifier创建replicate.yaml复制上节内容修改name和description即可cat replicate.yaml EOF name: my-text-classifier description: My first personal ML model registry visibility: private inputs: text: type: string default: I love this product! description: The input text to classify threshold: type: float default: 0.5 description: Confidence threshold for positive class output: type: object properties: label: type: string description: Predicted class: positive or negative confidence: type: float description: Models confidence score between 0 and 1 environment: python_version: 3.10 cuda_version: 11.8 predictions: - type: python file: predict.py requirements: - transformers4.38.2 - torch2.0.1cu118 EOF创建predict.py复制上节代码cat predict.py EOF from typing import Dict, Any import torch from transformers import AutoTokenizer, AutoModelForSequenceClassification from transformers import pipeline class Predictor: def __init__(self): self.model None self.tokenizer None self.classifier None def setup(self) - None: with torch.no_grad(): self.tokenizer AutoTokenizer.from_pretrained(distilbert-base-uncased-finetuned-sst-2-english) self.model AutoModelForSequenceClassification.from_pretrained( distilbert-base-uncased-finetuned-sst-2-english ) self.classifier pipeline( sentiment-analysis, modelself.model, tokenizerself.tokenizer, device0 if torch.cuda.is_available() else -1 ) def predict(self, text: str, threshold: float 0.5) - Dict[str, Any]: if not isinstance(text, str) or len(text.strip()) 0: raise ValueError(Input text must be a non-empty string) result self.classifier(text)[0] label result[label].lower() confidence float(result[score]) if label positive and confidence threshold: label neutral elif label negative and confidence threshold: label neutral return { label: label, confidence: confidence } EOF初始化 Gitgit init git add . git commit -m init: basic text classifier model4.2 第 2-3 分钟本地测试与调试最关键的一步在部署到云端前必须在本地用 Replicate CLI 模拟完整流程。这能暴露 80% 的配置错误# 安装 Replicate CLI如果还没装 pip install replicate # 登录如果还没登录 replicate login # 在本地运行 predict.py模拟 Replicate 的执行环境 replicate run .:latest --input textThis movie is terrible! --input threshold0.7注意.:latest的含义.表示当前目录即你的项目根目录latest是 Replicate 自动生成的临时版本标签。这条命令会读取当前目录的replicate.yaml解析requirements在本地创建一个临时虚拟环境或复用现有环境安装所有依赖执行predict.py的setup()调用predict()并传入--input参数打印返回的 JSON。如果一切顺利你会看到类似输出{label: negative, confidence: 0.992}如果失败常见原因及修复ModuleNotFoundError: No module named transformers说明replicate.yaml里的requirements没生效检查 YAML 缩进是否为 2 空格Replicate 严格要求 YAML 缩进OSError: Cant load tokenizerHugging Face Hub 访问失败检查网络或尝试HF_ENDPOINThttps://hf-mirror.com replicate run ...国内用户常用镜像AttributeError: NoneType object has no attribute classifiersetup()执行失败但被静默忽略了。在predict.py的setup()开头加print(Setting up model...)看是否执行到。实操心得我习惯在setup()末尾加一句print(fSetup completed. Model loaded on device: {self.classifier.device})这样本地测试时能看到设备信息确认 GPU 是否被正确识别。4.3 第 4 分钟一键部署到 Replicate 云端确认本地测试通过后部署就是一句话replicate deploy执行过程会显示Creating new model... Uploading code... Building model... Waiting for build to complete... Build succeeded! Your model is ready.几秒钟后你会看到类似输出Created model: r8_abcd1234efgh/my-text-classifier Version: r8_abcd1234efgh/my-text-classifier:5c37e8a2b1f0... (commit: 1234567)这个r8_abcd1234efgh/my-text-classifier就是你的个人模型仓库地址全球唯一。5c37e8a2b1f0...是这次部署的版本 ID对应你当前 Git commit。4.4 第 5 分钟验证云端运行与分享现在用真正的云端模型运行一次replicate run r8_abcd1234efgh/my-text-classifier:latest --input textI am so happy today! --input threshold0.6如果返回{label: positive, confidence: 0.987}恭喜你的个人模型仓库已建成你可以分享给同事把r8_abcd1234efgh/my-text-classifier:latest发给他他只需replicate run ...即可调用集成到脚本写一个batch_process.py循环读取 CSV对每行text调用replicate run升级模型修改predict.pygit commit再replicate deploy新版本自动发布为:latest旧版本 ID 依然可用如:5c37e8a2b1f0...。注意replicate run r8_abcd1234efgh/my-text-classifier:latest中的:latest是一个动态标签总是指向最后一次replicate deploy的版本。如果你想固定使用某个版本必须用完整的 SHA256 ID如:5c37e8a2b1f0...这是保证生产环境稳定的最佳实践。5. 常见问题与排查技巧实录那些官方文档不会告诉你的细节5.1 “模型构建成功但首次调用超时/失败” —— GPU 初始化的隐藏陷阱现象replicate deploy成功但第一次replicate run等待 60 秒以上最终返回{error: Prediction timed out}。原因Replicate 的 GPU 实例在首次启动时需要加载 CUDA 驱动、初始化 GPU 上下文、预热 cuDNN 库这个过程可能长达 40-50 秒。而 Replicate 的默认 timeout 是 60 秒刚好卡在边缘。解决方案主动预热部署后立即执行一次replicate run让它完成初始化。后续调用就会快很多。延长 timeout在replicate run命令后加--timeout 120单位秒replicate run r8_xyz/model:latest --input textwarmup --timeout 120终极方案在predict.py的setup()里加入一段“预热代码”def setup(self) - None: # ... 加载模型代码 ... # 预热用 dummy input 触发一次前向传播 if torch.cuda.is_available(): dummy_input self.tokenizer(warmup, return_tensorspt).to(self.model.device) with torch.no_grad(): _ self.model(**dummy_input) print(GPU warmup completed)5.2 “输入文件太大上传失败” —— 如何处理超过 100MB 的模型权重Replicate 的replicate run命令本身不支持上传大文件如 100MB 的.bin文件。如果你的模型权重很大比如 LLaMA-7B 的consolidated.bin不能直接放项目目录。正确做法把大权重放在 Hugging Face Hubpredict.py里用from_pretrained()下载。在 Hugging Face 创建一个私有 repo如yourname/my-llama-7b用huggingface-cli upload上传所有文件在predict.py的setup()里def setup(self) - None: # 从 HF Hub 加载Replicate 会自动缓存 self.model AutoModelForCausalLM.from_pretrained(yourname/my-llama-7b) self.tokenizer AutoTokenizer.from_pretrained(yourname/my-llama-7b)replicate.yaml的requirements里确保有transformers和safetensors推荐用 safetensors 格式加载更快更安全。实操心得我测试过一个 4.7GB 的 LLaMA-7B 模型首次replicate run会花 3-4 分钟下载权重但之后所有调用都在 2 秒内完成。Replicate 的镜像层缓存机制很聪明同一个模型的不同版本会共享基础权重层。5.3 “如何让模型支持多模态输入图片文本” ——file类型的正确用法replicate.yaml支持type: file但新手常误以为可以直接--input image/path/to/local.jpg。实际上Replicate CLI 会自动将开头的路径上传到其临时存储并把 URL 传给模型。所以predict.py必须能处理 URL# replicate.yaml inputs: image: type: file description: Input image (JPG/PNG) prompt: type: string description: Text prompt for the image# predict.py import requests from PIL import Image from io import BytesIO def predict(self, image: str, prompt: str) - Dict[str, Any]: # image 是一个 URL 字符串如 https://replicate.delivery/... response requests.get(image) response.raise_for_status() img Image.open(BytesIO(response.content)).convert(RGB) # 然后用 img 和 prompt 做多模态推理... return {result: done}关键点image: str的类型是str不是PIL.ImageReplicate 不会自动帮你下载和解码这一步必须在predict()里手动完成。而且requests.get()必须加response.raise_for_status()否则网络错误会静默失败。5.4 “模型部署后如何查看构建日志和错误详情”当replicate deploy失败时CLI 只会显示Build failed但不会打印详细日志。要查错访问 Replicate Web 控制台https://replicate.com/account/models找到你的模型点击进入在 “Versions” 标签页找到失败的版本点击右侧的...→ “View logs”日志会显示完整的pip install过程、setup()执行输出、以及任何 Python 异常堆栈。独家技巧在predict.py的setup()开头加print(DEBUG: Starting setup...)在predict()开头加print(fDEBUG: Received input: {text})。这些print语句会出现在构建日志和运行日志里是 debug 的黄金线索。5.5 “如何批量部署多个模型到同一个仓库” —— 模型命名的工程实践Replicate 的模型命名规则是username/model-name一个username下可以有无限模型。但如果你有 20 个相关模型如text-classifier-v1,text-classifier-v2,ner-model,summarizer全部平铺会混乱。推荐的工程实践用斜杠/做命名空间。Replicate 允许username/project-name/model-name这样的格式replicate deploy # 部署到 r8_xyz/nlp-tools/text-classifier replicate deploy # 部署到 r8_xyz/nlp-tools/ner-model replicate deploy # 部署到 r8_xyz/cv-tools/super-res这样你在 Web 控制台看到的是清晰的树状结构也方便用脚本批量管理如replicate models list | grep nlp-tools。命名空间不是文件夹只是字符串约定但极大提升可维护性。6. 进阶扩展与长期维护让这个“5分钟仓库”真正成为你的生产力引擎6.1 与 GitHub Actions 深度集成实现“Push to Deploy”你不需要每次手动replicate deploy。把部署流程接入 CI/CD实现真正的自动化在 GitHub 仓库 Settings → Secrets and variables → Actions添加REPLICATE_API_TOKEN值为你~/.replicate/credentials里的 token创建.github/workflows/replicate-deploy.ymlname: Deploy to Replicate on: push: branches: [main] paths: [replicate.yaml, predict.py, **/*.py] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 - name: Set up Python uses: actions/setup-pythonv4 with: python-version: 3.10 - name: Install Replicate CLI run: pip install replicate - name: Deploy to Replicate env: REPLICATE_API_TOKEN: ${{ secrets.REPLICATE_API_TOKEN }} run: replicate deploy每次你git push到main分支Actions 就会自动触发部署。这不仅是效率提升更是模型变更的可审计性保障——每一次模型更新都对应一个 Git commit、一个 CI job log、一个 Replicate version ID。6.2 构建私有模型发现页面用静态网站托管你的“个人 Hugging Face Hub”Replicate