本地代码在 BigQuant AIStudio 云端运行
由bq1fuwkt创建,最终由bq1fuwkt 被浏览 10 用户
问题描述
我有一些 Python 脚本需要在云端运行(例如需要更大内存、GPU 资源,或访问云端专有数据),应该如何通过本地 SDK 将代码提交到 BigQuant AIStudio 云端执行?
详细解答
BigQuant SDK 提供了 aistudio 模块,可以启动云端 AIStudio 在其中执行本地的 Python 代码或脚本文件。
1. 查看可用的云端资源规格
首先查看有哪些资源配置可供选择:
import bigquant
# 获取 AIStudio 资源规格列表
specs = bigquant.aistudio.list()
print(f"可用资源规格数量: {len(specs)}")
print("\n资源规格列表:")
print(f"{'规格ID':<38} {'名称':<15} {'CPU':<4} {'内存(GB)':<8} {'GPU':<4} {'价格(BQC/分)'}")
print("-" * 90)
for spec in specs[:10]: # 只显示前10个
print(f"{spec['id']:<38} {spec['name']:<15} {spec['cpu']:<4} "
f"{spec['memory']:<8} {spec['gpu']:<4} {spec.get('price', 0)}")
- 关键说明
- 资源规格包含 CPU、内存、GPU 等配置信息
- price 表示使用价格(BQC/分钟),0 表示免费规格
- 记录所需规格的 id,用于后续启动实例
2. 启动 AIStudio 实例
使用默认规格或指定规格启动云端实例:
# 方式1: 使用默认规格(免费 D0 规格:1C/6G)
studio = bigquant.aistudio.start()
print("✓ AIStudio 已启动(默认规格)")
# 方式2: 指定资源规格
resource_spec_id = "3fa85f64-5717-4562-b3fc-2c963f66afa6" # 替换为实际规格ID
studio = bigquant.aistudio.start(resource_spec_id=resource_spec_id)
print(f"✓ AIStudio 已启动(规格ID: {resource_spec_id})")
- 关键说明
- start() 会自动等待实例启动完成(最多60秒)
- 如果已有运行中的实例且规格匹配,会直接返回现有实例
- 如果规格不匹配,会关闭旧实例并启动新实例
- 实例启动后会保持运行,直到手动关闭或超时自动关闭
3. 执行代码字符串
在云端实例中执行 Python 代码:
# 定义要执行的代码
code = """
import pandas as pd
import numpy as np
# 在云端执行计算
data = pd.DataFrame({
'a': np.random.randn(5),
'b': np.random.randn(5)
})
# 计算统计信息
mean_a = data['a'].mean()
std_b = data['b'].std()
print(f"Mean of a: {mean_a:.4f}")
print(f"Std of b: {std_b:.4f}")
print("\\nDataFrame:")
print(data)
"""
# 执行代码并获取输出
output = studio.run(code, is_code=True)
print("执行结果:")
print(output)
- 关键说明
- is_code=True 表示传入的是代码字符串(不是文件路径)
- 代码在云端 Jupyter kernel 中执行
- print() 的输出会通过 WebSocket 返回到本地
- 执行超时时间默认为 300 秒(5分钟)
4. 执行本地脚本文件
# 假设有一个本地脚本文件
script_path = "/Users/username/my_script.py"
# 执行脚本并获取输出
output = studio.run(script_path, is_code=False)
print("脚本执行结果:")
print(output)
- 关键说明
- is_code=False 表示传入的是文件路径(必须是绝对路径)
- SDK 会读取本地文件内容并发送到云端执行
- 脚本中的 print() 输出会返回到本地
5. 在云端访问 BigQuant 数据
code = """
import dai
# 在云端查询股票数据
result = dai.query('''
SELECT date, instrument, close, volume
FROM cn_stock_bar1d
WHERE date >= '2024-12-01' AND date <= '2024-12-10'
AND instrument IN ('000001.SZ', '000002.SZ')
ORDER BY date, instrument
''')
df = result.df()
print(f"查询到 {len(df)} 条数据")
print(df.head(10))
"""
output = studio.run(code, is_code=True)
print(output)
- 关键说明
- 云端代码使用 import dai(不是 import bigquant)
- 云端查询比本地 SDK 查询更快(无需网络传输数据)
- 适合大数据量查询或复杂计算场景
6. 云端计算密集型任务
利用云端资源进行复杂计算:
code = """
import pandas as pd
import numpy as np
from scipy import stats
# 模拟大规模数据处理
np.random.seed(42)
data = pd.DataFrame({
'returns': np.random.randn(100000) * 0.01
})
# 计算各种统计指标
mean = data['returns'].mean()
std = data['returns'].std()
skew = stats.skew(data['returns'])
kurt = stats.kurtosis(data['returns'])
# 计算 VaR 和 CVaR
var_95 = np.percentile(data['returns'], 5)
cvar_95 = data['returns'][data['returns'] <= var_95].mean()
print(f"样本数量: {len(data)}")
print(f"均值: {mean:.6f}")
print(f"标准差: {std:.6f}")
print(f"偏度: {skew:.6f}")
print(f"峰度: {kurt:.6f}")
print(f"VaR (95%): {var_95:.6f}")
print(f"CVaR (95%): {cvar_95:.6f}")
"""
output = studio.run(code, is_code=True)
print("计算结果:")
print(output)
- 关键说明
- 云端实例可以使用更大的内存和 CPU 资源
- 适合处理大规模数据或复杂计算
- 计算完成后结果通过 print() 返回
7. 获取云端计算结果(保存为数据源)
如果云端计算结果需要在本地使用,可以保存为 DataSource:
code = """
import dai
import pandas as pd
# 在云端计算因子
result = dai.query('''
SELECT
date,
instrument,
close,
m_avg(close, 5) as ma5,
m_avg(close, 20) as ma20
FROM cn_stock_bar1d
WHERE date >= '2024-01-01' AND date <= '2024-12-31'
AND instrument IN ('000001.SZ', '000002.SZ', '600000.SH')
''')
df = result.df()
# 保存为数据源
ds = dai.DataSource.write_bdb(
data=df,
id="cloud_computed_factors",
partitioning=["date"],
indexes=["instrument"],
unique_together=["date", "instrument"],
overwrite=True
)
# 输出数据源ID(重要!)
print(ds.id)
"""
# 执行代码,获取数据源ID
datasource_id = studio.run(code, is_code=True).strip()
print(f"✓ 云端计算完成,数据源ID: {datasource_id}")
# 在本地读取云端计算的结果
ds = bigquant.dai.DataSource(datasource_id)
df_local = ds.read_bdb(as_type=pd.DataFrame)
print(f"\n本地读取到 {len(df_local)} 条数据")
print(df_local.head())
- 关键说明
- 云端计算结果保存为 DataSource,便于本地读取
- 通过 print(ds.id) 输出数据源 ID
- 本地使用该 ID 读取数据
8. 关闭 AIStudio 实例
使用完毕后关闭实例,释放资源:
# 关闭实例
studio.close()
print("✓ AIStudio 实例已关闭")
- 关键说明
- close() 会停止云端容器,释放计算资源
- 配置和数据会被保留,可以重新启动
- 如果不手动关闭,实例会在一段时间后自动关闭
使用 CLI 工具执行脚本
BigQuant SDK 还提供了命令行工具,可以直接提交脚本:
BigQuant SDK 还提供了命令行工具,可以直接提交脚本:
# 查看可用资源规格
bq aistudio list
# 执行本地脚本
bq aistudio run --file /path/to/your_script.py
# 指定资源规格
bq aistudio run --file /path/to/your_script.py \
--resource-spec-id "3fa85f64-5717-4562-b3fc-2c963f66afa6"
- 关键说明
- CLI 工具会自动启动实例、执行脚本、显示输出
- 适合快速测试或集成到自动化流程
- 脚本必须是绝对路径
关键概念解释
AIStudio
BigQuant 提供的云端 AIStudio 环境,支持多种资源配置(CPU、内存、GPU)。用户可以按需启动实例,执行计算密集型任务。
资源规格 (Resource Spec)
定义 AIStudio 实例的硬件配置,包括:
- cpu: CPU 核数
- memory: 内存大小(GB)
- gpu: GPU 数量
- price: 使用价格(BQC/分钟)
studio.run() 执行流程
- 检查 AIStudio 健康状态
- 启动 Jupyter kernel
- 通过 WebSocket 发送代码
- 等待执行完成并收集输出
- 返回 stdout 输出(print 内容)
is_code 参数
- is_code=True: 传入的是 Python 代码字符串
- is_code=False: 传入的是脚本文件路径(必须是绝对路径)
云端 vs 本地执行
- 云端执行: 使用 studio.run(),代码在 AIStudio 中执行,适合大数据量或复杂计算
- 本地执行: 直接运行 Python 脚本,适合小规模计算或开发调试
适用场景
-
大规模数据处理
本地内存不足时,使用云端大内存实例处理海量数据。
-
批量因子计算
计算大量股票的技术指标或自定义因子。
-
云端数据访问
直接在云端查询和处理数据,无需本地下载。
-
定时任务
通过脚本自动化执行定期计算任务。
注意事项
- 路径必须绝对: 执行脚本时,文件路径必须是绝对路径(如 /Users/username/script.py)
- 实例自动关闭: 长时间不使用会自动关闭,建议及时手动关闭以节省资源
- 输出限制: 只能获取 print() 的输出,无法直接返回 Python 对象
- 数据传递: 云端计算结果需保存为 DataSource 后在本地读取
- 超时设置: 默认执行超时 300 秒,超长任务需考虑分批处理
- 错误处理: 代码执行错误会通过异常返回,需做好异常捕获
性能优化建议
- 选择合适规格: 根据任务需求选择 CPU/内存配置,避免资源浪费
- 减少数据传输: 尽量在云端完成计算,只传递最终结果
- 批量处理: 将多个小任务合并为一次云端执行
- 复用实例: 多个任务可复用同一个 AIStudio 实例,无需反复启动
- 并行计算: 利用云端多核 CPU 进行并行计算
\