本地代码在 BigQuant AIStudio 云端运行
由bq1fuwkt创建,最终由bq1fuwkt 被浏览 1 用户
问题描述
我有一些 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 进行并行计算
\