[ PROMPT_NODE_26822 ]
functions
[ SKILL_DOCUMENTATION ]
# Modal 函数
## 基础函数定义
使用 `@app.function()` 装饰 Python 函数:
python
import modal
app = modal.App(name="my-app")
@app.function()
def my_function():
print("Hello from Modal!")
return "result"
## 调用函数
### 远程执行
调用 `.remote()` 在 Modal 上运行:
python
@app.local_entrypoint()
def main():
result = my_function.remote()
print(result)
### 本地执行
调用 `.local()` 在本地运行 (适用于测试):
python
result = my_function.local()
## 函数参数
函数接受标准的 Python 参数:
python
@app.function()
def process(x: int, y: str):
return f"{y}: {x * 2}"
@app.local_entrypoint()
def main():
result = process.remote(42, "answer")
## 部署
### 临时应用
临时运行:
bash
modal run script.py
### 已部署应用
持久化部署:
bash
modal deploy script.py
从其他代码访问已部署的函数:
python
f = modal.Function.from_name("my-app", "my_function")
result = f.remote(args)
## 入口点 (Entrypoints)
### 本地入口点
在本地机器上运行的代码:
python
@app.local_entrypoint()
def main():
result = my_function.remote()
print(result)
### 远程入口点
使用不带 local_entrypoint 的 `@app.function()` - 完全在 Modal 上运行:
python
@app.function()
def train_model():
# 所有代码都在 Modal 中运行
...
调用方式:
bash
modal run script.py::app.train_model
## 参数解析
具有原始类型参数的入口点会自动进行 CLI 解析:
python
@app.local_entrypoint()
def main(foo: int, bar: str):
some_function.remote(foo, bar)
运行方式:
bash
modal run script.py --foo 1 --bar "hello"
对于自定义解析,接受可变长度参数:
python
import argparse
@app.function()
def train(*arglist):
parser = argparse.ArgumentParser()
parser.add_argument("--foo", type=int)
args = parser.parse_args(args=arglist)
## 函数配置
常用参数:
python
@app.function(
image=my_image, # 自定义环境
gpu="A100", # GPU 类型
cpu=2.0, # CPU 核心数
memory=4096, # 内存 (MB)
timeout=3600, # 超时时间 (秒)
retries=3, # 重试次数
secrets=[my_secret], # 环境变量密钥
volumes={"/data": vol}, # 持久化存储
)
def my_function():
...