ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

marimo 云服务示例实战:用 uv 沙箱运行 GCP 数据应用,用 Modal 部署 GPU 笔记本与应用

marimo 云服务示例实战:用 uv 沙箱运行 GCP 数据应用,用 Modal 部署 GPU 笔记本与应用 marimo 云服务示例实战用 uv 沙箱运行 GCP 数据应用用 Modal 部署 GPU 笔记本与应用【免费下载链接】marimoA reactive notebook for Python — run reproducible experiments, query with SQL, execute as a script, deploy as an app, and version with git. Stored as pure Python. All in a modern, AI-native editor.项目地址: https://gitcode.com/GitHub_Trending/ma/marimomarimo 仓库的examples/cloud/目录收录了一组面向云服务商 API 的可运行笔记本示例覆盖 Google CloudBigQuery、Cloud Storage、Google Sheets与 ModalGPU 可编辑笔记本、只读 Web 应用部署两类场景。读完本篇你将掌握如何用uvx marimo edit --sandbox一条命令在任何示例笔记本上自动安装依赖并启动GCP 示例中凭据注入与交互式数据浏览的完整模式以及在 Modal 容器中通过隧道暴露可编辑笔记本、通过 ASGI 接口部署只读应用的两条部署链路。一、cloud 示例目录提供了什么examples/cloud/README.md 是这组示例的入口文档其定位是展示如何用 marimo 笔记本消费各种云服务商 API。目录下的示例组织如下示例路径演示内容Google Cloud BigQuerygoogle_cloud_bigquery.py列出 dataset/table预览前 10 行数据Google Cloud Storagegoogle_cloud_storage.py浏览 bucket 文件树、前缀过滤、在线查看图片/文本Google Sheetsgoogle_sheets.py通过 gspread 读取表格并渲染为 marimo 表格Modal 可编辑笔记本modal_edit.py在 Modal GPU 容器里运行可编辑的 marimo 编辑器Modal 只读应用modal_app.py把 marimo 笔记本作为 ASGI 应用部署到 Modal配套笔记本nbs/notebook.py供上述两个 Modal 示例加载含nvidia-smiGPU 检测README 同时欢迎通过 pull request 补充新的云服务商示例因此这个目录是一个持续扩展的“云 API 用法样例库”。二、如何运行这些示例README 的标准流程examples/cloud/README.md 给出的运行方式分为两种其核心前提是每个笔记本的依赖都以内置注释的形式序列化在文件头部。例如 google_cloud_storage.py 的文件开头即是一个 PEP 723 脚本元数据块# /// script # requires-python 3.9 # dependencies [ # google-cloud-storage2.18.2, # marimo, # protobuf5.28.2, # ] # ///这块元数据就是--sandbox模式能自动装依赖的依据。2.1 推荐方式uv --sandboxREADME 推荐的两步流程安装uvastral-sh 出品的 Python 包管理器用uvx marimo edit --sandbox notebook-url打开任意一个示例笔记本。--sandbox标志会让笔记本运行在一个隔离的虚拟环境中并自动安装该笔记本声明的依赖。以 GCS 示例为例完整命令为uvx marimo edit --sandbox examples/cloud/gcp/google_cloud_storage.py--sandbox的底层机制源码级补充实现位于 marimo/_cli/sandbox.py。run_in_sandbox()约 L449-L474会把原始marimo命令包裹进uv run创建一个临时虚拟环境来隔离运行construct_uv_flags()约 L251-L322则负责拼装uv run参数关键参数包括--isolated --no-project沙箱不会拾取当前项目里的pyproject.toml避免与笔记本自身声明的依赖冲突--with-requirements 临时文件依赖清单直接来自笔记本头部的 PEP 723 元数据对.py文件还会先执行uv export --script做依赖解析--python 版本优先取脚本元数据里的requires-python否则回退到当前解释器版本--compile-bytecode用安装时间换取更快的启动时间。此外resolve_sandbox_mode()约 L96-L128区分了两种沙箱模式对单个文件使用SINGLE模式整体进程被uv run包裹对目录使用MULTI模式每个笔记本一个沙箱内核。若未显式传--sandbox而笔记本又内置了依赖CLI 还会交互式询问是否进入沙箱maybe_prompt_run_in_sandbox约 L50-L93。2.2 不使用 uv 的方式README 也给出了手动模式先自行安装 marimo然后运行marimo edit notebook-url但此时需要自己手动安装各笔记本# /// script块中列出的 requirements。例如运行 BigQuery 示例需手动安装google-cloud-bigquery3.25.0、db-dtypes1.3.0、protobuf5.28.2等。两种方式的取舍在于--sandbox免去环境配置手动模式则适合依赖已在本地就绪或需要复现特定环境的场景。三、GCP 示例三种云服务的交互模式三个 GCP 示例google_cloud_bigquery.py、google_cloud_storage.py、google_sheets.py共享一套“凭据配置 客户端初始化 交互式浏览”的笔记本结构下面按服务逐个拆解。3.1 BigQuery从 dataset 到表数据预览BigQuery 示例的依赖声明为requires-python 3.9# dependencies [ # db-dtypes1.3.0, # google-cloud-bigquery3.25.0, # marimo, # protobuf5.28.2, # ]其单元格链路为凭据配置单元格mo.ui.text(placeholderpath/to/creds.json)接收一个凭据文件路径。文档说明支持两种方式——先执行gcloud auth login或提供 service account 凭据文件路径客户端初始化单元格L58-L74若填写了凭据路径则写入os.environ[GOOGLE_APPLICATION_CREDENTIALS]否则清除该环境变量回退到默认应用凭据。项目名优先取输入框其次读GCLOUD_PROJECT环境变量二者皆空时用mo.stop(not _project, mo.md(☝️ Provide a gcloud project.))阻断后续单元格执行级联选择先client.list_datasets()填充mo.ui.dropdown选定 dataset 后再client.list_tables(dataset)填充第二个下拉框数据预览client.list_rows(dataset.table(selected_table.value), max_results10).to_dataframe()取前 10 行经mo.ui.table(results.to_dataframe(), selectionNone)渲染成只读表格。这套“mo.stop前置校验 级联 dropdown 只读 table”的模式是把一个云 SDK 客户端封装成 Web 数据浏览器的典型写法。3.2 Cloud Storage前缀过滤与文件在线预览GCS 示例marimo.App(widthfull)全宽布局在客户端初始化部分与 BigQuery 示例几乎同构同样的GOOGLE_APPLICATION_CREDENTIALS注入逻辑差异在浏览层前缀状态get_prefix, set_prefix mo.state()维护一个共享状态列表单元格bucket.list_blobs(max_results30, prefix_prefix)_prefix get_prefix() or None即状态变化会自动重跑列表表格增强每一行文件渲染为字典其中“文件夹”名称以/结尾的条目多一个Filter 按钮on_changelambda _: set_prefix(blob.name)点击即把该行设为新的前缀实现目录式下钻“Url”列则用mo.Html生成指向 Cloud Storage 控制台的外部链接内容预览表格选中某行后file_table.value[0]按content_type判断——image/*或.png用mo.image(_blob.download_as_string())其余用mo.plain_text(_blob.download_as_text())并统一经mo.output.replace(...)替换输出避免输出区随选择堆积。3.3 Google Sheetsgspread 服务账户凭据google_sheets.py 的依赖为gspread6.1.2、oauth2client4.1.3、pandas2.2.3。其凭据处理比前两者多一条分支L47-L64_scopes [ https://spreadsheets.google.com/feeds, https://www.googleapis.com/auth/drive, ] if credentials.value: os.environ[GOOGLE_APPLICATION_CREDENTIALS] credentials.value creds ServiceAccountCredentials.from_json_keyfile_name(credentials.value, _scopes) else: os.environ.pop(GOOGLE_APPLICATION_CREDENTIALS, None) creds GoogleCredentials.get_application_default().create_scoped(_scopes) gc gspread.authorize(creds)即填写了凭据文件就走服务账户ServiceAccountCredentials.from_json_keyfile_name否则取默认应用凭据并显式限定 scope。读取时通过gc.open_by_url(spreadsheet_url.value).sheet1打开表格pd.DataFrame(wks.get_all_records())转成 pandas 后交给mo.ui.table展示mo.stop(not spreadsheet_url.value)保证未填 URL 时不发起请求。四、Modal 示例GPU 可编辑笔记本与只读应用部署examples/cloud/modal/README.md 说明该子目录演示如何把 marimo 笔记本跑在 Modal 容器上以获取云 GPU前置条件为 Modal 账户和uv包管理器。两条链路如下。4.1 可编辑笔记本modal_edit.py完整运行命令指定 Python 3.12uvx -p 3.12 modal run modal_edit.pymodal_edit.py 的实现要点app modal.App( imagemodal.Image.debian_slim() .pip_install(marimo0.12.8, modal0.73.166) .add_local_dir(nbs, remote_path/root/nbs), ) TOKEN secrets.token_urlsafe(16) PORT 2718 app.function(max_containers1, timeout1_500, gput4) def run_marimo(timeout: int): with modal.forward(PORT) as tunnel: marimo_process subprocess.Popen( [marimo, edit, --headless, --host, 0.0.0.0, --port, str(PORT), --token-password, TOKEN, nbs/notebook.py], ) print(fMarimo available at {tunnel.url}?access_token{TOKEN})镜像与本地目录debian_slim基础上pip_installmarimo 与 modaladd_local_dir(nbs, remote_path/root/nbs)把本地 nbs/ 笔记本目录挂载进容器GPU 选择app.function(..., gput4)指定 GPU 型号README 提示“可编辑modal_edit来配置 GPU 选择”隧道与鉴权modal.forward(PORT)创建公网隧道编辑器以--headless无浏览器环境--host 0.0.0.0监听容器内所有网卡--token-password随机 token拼接在隧道 URL 的access_token查询参数上启动max_containers1防止重复计费扩容生命周期app.local_entrypoint()里的main()调用run_marimo.remote(1000)函数体进入循环等待超时或被KeyboardInterrupt后在finally中marimo_process.kill()关闭容器内的 marimo 进程。被加载的 nbs/notebook.py 本身是一个演示笔记本通过subprocess.run([nvidia-smi], ...)探测 GPU——存在则展示nvidia-smi输出FileNotFoundError时降级为“running on CPU”提示另一个单元格用mo.ui.table展示sys.version、sys.executable、工作目录等运行时信息用于确认容器内环境。4.2 只读应用modal_app.py把笔记本以只读应用形式部署到 Modal 的命令uvx -p 3.12 \ --with modal \ --with marimo \ modal serve modal_app.pymodal_app.py 只有 24 行结构为server marimo.create_asgi_app().with_app(path, root/marimo/notebook.py) app modal.App() app.function( imagemodal.Image.debian_slim() .pip_install(marimo0.12.8, fastapi) .add_local_dir(./nbs, remote_path/marimo), gpuNone, max_containers1, memory256, ) modal.concurrent(max_inputs2) asgi_app() def marimo_asgi(): return server.build()marimo.create_asgi_app()是 marimo 官方 ASGI 服务入口实现在 marimo/_server/asgi.pycreate_asgi_app函数.with_app(path, root/marimo/notebook.py)指定容器内笔记本根路径与挂载前缀装饰器链asgi_app()Modal 的 ASGI 封装modal.concurrent(max_inputs2)并发上限 2 函数级镜像配置gpuNone, memory256表示只读服务默认不占 GPU、256 MB 内存即可nbs/notebook.py经add_local_dir挂到容器的/marimo与with_app的root对应。与 4.1 的区别可以概括为可编辑链路走进程 端口隧道marimo 完整编辑器写权限长连接只读链路走ASGI 反向托管marimo 以 Web 应用形态被 Modal 托管无状态、可并发二者分别对应“在云上开发”和“把笔记本当应用发布”两种云用法。五、小结这组示例沉淀的三个通用模式PEP 723 依赖自描述所有示例把requires-python与dependencies序列化进文件头注释使uvx marimo edit --sandbox一类命令可以零配置启动沙箱构建逻辑集中在 marimo/_cli/sandbox.py凭据注入二分支GCP 示例统一采用“输入凭据文件路径 → 写GOOGLE_APPLICATION_CREDENTIALS留空 → 清除该变量回退默认凭据或ServiceAccountCredentials服务账户分支”配合mo.stop阻断无效请求两条云部署链路需要交互编辑时用modal run 端口隧道 --token-password只发布成果时用create_asgi_app()modal serve的 ASGI 方案容器配置GPU、内存、并发度全部在装饰器参数里声明。以上路径均可在当前仓库中直接查看适合作为将任意 marimo 笔记本接入云 API 或云算力平台的参考模板。【免费下载链接】marimoA reactive notebook for Python — run reproducible experiments, query with SQL, execute as a script, deploy as an app, and version with git. Stored as pure Python. All in a modern, AI-native editor.项目地址: https://gitcode.com/GitHub_Trending/ma/marimo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表