You need to enable JavaScript to run this app.
文档中心
对象存储

对象存储

复制全文
下载 pdf
AIGC-豆包大模型最佳实践
TOS-豆包大模型最佳实践:视觉理解&生图模型&视频生成
复制全文
下载 pdf
TOS-豆包大模型最佳实践:视觉理解&生图模型&视频生成
图片处理在众多领域如互联网、媒体、电商等都有着广泛的应用。火山方舟模型在视觉理解、生图和视频生成等方面展现出强大的能力,而对象存储凭借其高效的数据存储和灵活的数据处理能力,能够为火山方舟的模型提供有力支持。本文档旨在介绍如何充分利用对象存储的数据处理能力,优化火山方舟模型的预处理及后处理流程,提升处理效率和质量。​
背景信息​
火山方舟支持丰富的模型,例如:​
  • 视觉理解:多模态大模型,具备强大的图片理解与推理能力,以及精准的指令理解能力。模型在图像文本信息抽取、基于图像的推理任务上有展现出了强大的性能,能够应用于更复杂、更广泛的视觉问答任务。​
  • 图文生图:支持多种视觉风格。根据垂类场景,提供多种服务,可广泛应用于教育、娱乐、办公等场景。​
  • 视频生成:支持输入文本、图片生成视频,具备出色的语义理解能力,能快速生成优质的视频片段,可应用于影视创作、广告传媒等多个场景。​
火山方舟支持的模型列表,请参见模型列表。​
使用限制​
由于模型类型等限制,在实际使用图片类型模型中,可能存在如下需求:​
​
图片处理操作​
说明​
图片格式转换​
模型支持传入的图片格式有限,例如您使用 iOS 系统拍摄的照片,由于是 .heic 格式,需要转换成模型支持的图片格式后再使用。​
图片压缩​
模型传入的文件大小有限制,如果您上传的图片超出限制,您需要先完成图片压缩后,再使用该模型。​
图片缩放​
模型理解图片,会将图片转化为 token ,再进行推理计算。token 用量是根据图片宽高像素计算得到。图片缩放后,可以支持更多的处理张数,节省使用成本。​
省流​
如果您需要传入的图片在本地,您需要将这个图片转化为 Base64 编码,再提交给大模型。Base64 编码会增大传输的流量。​
视频​
视觉理解模型本质上仅能对图片内容进行理解,如果您上传的是视频,您需要先获取视频截帧后的静图,再由视觉理解模型对静图内容进行理解。​
模型结果处理​
模型输出结果对应的图片需要进一步优化,如添加标注、水印等后处理,处理后按需提供给下游应用。​
​
能力说明​
通过接入对象存储服务,可以给您在使用大模型时带来更优的体验。对象存储服务在图片处理方面提供了高效、灵活且可扩展的解决方案,TOS 同时支持多种图片处理能力,可与火山方舟的视觉理解模型、文/图生图模型、视频生成模型等组合使用,支持的常见模型类型及说明请参见模型列表。​
说明​
如果您有其他模型使用需求,您可以提交工单联系技术支持。​
方案说明​
根据 TOS 现有能力及您的业务目标,我们提供了如下方案:​
​
业务目标​
操作步骤​
图片预处理​
  1. 通过步骤 1&2,将需要预处理的图片先上传至 TOS。TOS 支持多种上传方式及多种存储类型,满足您不同场景的上传及存储需求。​
  1. 您可以调用 TOS 图片处理功能(如格式转换、压缩等),然后将处理后的图片的 TOS URL 作为方舟模型的输入。​
说明​
您还可以将预处理后的图片保存在 TOS 中,方便后面多次使用。​
  1. 推理后,您可以直接获取方舟输出结果或将方舟结果保存在自己火山账号的 TOS 桶中(强烈推荐)。​
图片后处理​
  • 图片​
  1. 通过图文生图模型生成图片,并将图片保存到 TOS 桶中。​
  1. 调用 TOS 图片处理能力(如添加您自己的水印、设置原图保护等),对图片后处理后通过 TOS 支持的分发能力(分享、PreSignedURL、或结合 CDN 等)向最终目标端进行分发。​
  • 视频​
  1. 通过视频生成模型生成视频,并将视频保存到 TOS 桶中。​
  1. 调用 TOS 图片处理能力(如视频截帧等),对视频处理后通过 TOS 支持的分发能力(分享、PreSignedURL、或结合 CDN 等)向最终目标端进行分发。​
​
​Image​​
方案优势​
本文以视觉理解模型为例,介绍使用 TOS 组合方案的优势。​
​
类型​
自建图片处理+豆包大模型​
TOS + 豆包大模型组合方案​
提升部分限制​
  • 图片大小限制:建议小于 500KB,最大为 10MB。​
  • 图片格式限制:jpeg、webp 等,详情请参见图片理解。​
  • 文件大小限制:建议小于 20MB。​
  • 文件格式限制:jpg/jpeg、png、bmp、gif、webp、tiff 及视频等。​
压缩方式​
引入开源组件,自行实现压缩​
专有图像处理服务。​
算力​
消耗本地算力​
云端算力,专有芯片。​
性能​
-​
相比 Base64 方案,传输数据较小。​
费用成本​
  • 公网流出带宽/流量费用:0.5元/GB​
  • 请求次数费用:0.01~1元/万次​
  • 处理量:本地主机算力费用​
  • 内网传输,不需要内网流量费用。​
  • 图像处理费用:提供 10 TB 的免费处理额度,超额后费用为 0.025/GB,计费详情请参见数据处理费用。​
复杂性​
便于本地调试​
控制台配置,一次配置,永久生效。​
注意​
虽然是自动化配置,但首次配置可能会出错。配置前您需要确认所需的图片处理样式。​
​
操作准备​
​
TOS 侧配置
火山方舟侧配置
​
  1. 创建存储桶并获取存储桶的内网访问域名。使用控制台创建存储桶的操作步骤,请参见创建存储桶。​
说明​
通过火山方舟访问 TOS 服务为内网访问,因此不会产生公网流出流量费用。​
  • ​Image​​
  1. (可选)把需要的图片或视频上传至 TOS。​
  • TOS 支持多种上传方式,详情请参见快速入门。如果您的图片在其他源端,您也可以通过存储迁移工具,将图片或视频迁移至 TOS。​
  • 本文以 Python SDK 为例,介绍将本地图片或视频上传至 TOS 的示例代码。Python SDK 详细说明,请参见 概述(Python SDK)。​
  • ​
    import os​
    import tos​
    ​
    ​
    # 从环境变量获取 AK 和 SK 信息。​
    ak = os.getenv('TOS_ACCESS_KEY')​
    sk = os.getenv('TOS_SECRET_KEY')​
    # your endpoint 和 your region 填写Bucket 所在区域对应的Endpoint。# 以华北2(北京)为例,your endpoint 填写 tos-cn-beijing.ivolces.com,your region 填写 cn-beijing。​
    endpoint = "your endpoint"​
    region = "your region"​
    bucket_name = "bucket-test"​
    # 对象名称,例如 example_dir 下的 example_object.jpg 文件,则填写为 example_dir/example_object.jpg​
    object_key = "object-test"​
    # 本地文件路径​
    file_name = "/usr/local/test.jpg"​
    try:​
    # 创建 TosClientV2 对象,对桶和对象的操作都通过 TosClientV2 实现​
    client = tos.TosClientV2(ak, sk, endpoint, region)​
    # 将本地文件上传到目标桶中​
    # file_name为本地文件的完整路径。​
    client.put_object_from_file(bucket_name, object_key, file_name)​
    except tos.exceptions.TosClientError as e:​
    # 操作失败,捕获客户端异常,一般情况为非法请求参数或网络异常​
    print('fail with client error, message:{}, cause: {}'.format(e.message, e.cause))​
    except tos.exceptions.TosServerError as e:​
    # 操作失败,捕获服务端异常,可从返回信息中获取详细错误信息​
    print('fail with server error, code: {}'.format(e.code))​
    # request id 可定位具体问题,强烈建议日志中保存​
    print('error with request id: {}'.format(e.request_id))​
    print('error with message: {}'.format(e.message))​
    print('error with http code: {}'.format(e.status_code))​
    print('error with ec: {}'.format(e.ec))​
    print('error with request url: {}'.format(e.request_url))​
    except Exception as e:​
    print('fail with unknown error: {}'.format(e))​
    ​
​
根据您需要处理的资源类型以及输出的图片要求,您需要创建包含相应配置的图片处理样式或者获取图片处理样式参数详情,TOS 支持的图片处理重点能力如下,更多功能详情,请参见图片处理概述。​
​
格式转换
压缩(图片缩放)
压缩(质量变换)
水印(文字/图片水印)
视频截帧
图片持久化
原图保护
​
  • 能力说明:转换图片格式。​
  • 示例:​
  • 处理参数:image/format,png​
  • 处理示例:https://tos-tools.tos-cn-beijing.volces.com/misc/sample.png?x-tos-process=image/format,png​
  • 图形化样例:​
​Image​​
​
场景示例​
本文根据 TOS 数据处理能力及方舟模型类型,介绍不同场景下的示例代码。​
TOS + 视觉理解模型​
在线推理​
场景说明如下:​
  • 场景 1:TOS 不保存处理后的图片或视频截帧文件,即处理后的结果只作为模型的单次输入,无法重复使用。如您后续还想继续使用该图片,需要重新调用 TOS 处理,可能会产生一部分数据处理及请求等费用,详情请参见计费概述。​
  • 场景 2:使用图片处理持久化功能,将处理后的图片或视频截帧文件保存至 TOS,保存后即可重复使用。​
​
场景1
场景2
​
​
# coding:utf-8​
"""​
该代码示例展示了如何使用火山引擎的TOS(对象存储服务)进行图片和视频的处理及URL生成,​
并结合火山方舟视觉理解大模型进行图像相关的问答。​
​
在运行此代码前,请确保已安装相应的SDK:​
1. `pip install --upgrade 'volcengine-python-sdk[ark]'`​
2. `pip install tos`​
​
注意:请妥善保管您的密钥信息,避免泄露。​
"""​
import tos​
from volcenginesdkarkruntime import Ark​
​
# TOS服务的访问密钥​
TOS_ACCESS_KEY = "Your Access Key"​
TOS_SECRET_KEY = "Your Secret Key"​
# 火山方舟的API密钥​
ARK_API_KEY = "Your API Key"​
​
​
if __name__ == "__main__":​
"""​
主函数,执行主要的业务逻辑,包括TOS操作和火山方舟模型调用。​
"""​
# TOS服务的相关配置​
endpoint = "Your Endpoint"​
region = "Your Region"​
bucket_name = "Your Bucket"​
image_key = "test.jpeg"​
video_key = "test.mp4"​
# 定义图片处理方式​
image_process_style = "image/resize,h_100/format,jpg"​
# 定义视频处理方式​
video_process_style = "video/snapshot,t_2000"​
​
# 创建TOS客户端​
tos_client = tos.TosClientV2(TOS_ACCESS_KEY, TOS_SECRET_KEY, endpoint, region)​
​
# 预签名图片处理URL,供方舟调用​
image_url = tos_client.pre_signed_url(tos.HttpMethodType.Http_Method_Get, bucket=bucket_name, key=image_key,​
query={"x-tos-process": image_process_style}, expires=3600)​
print("----- Generate Image PreSignedURL Success ------")​
print(f"PreSignedURL: {image_url.signed_url}")​
​
# 预签名视频截帧URL,供方舟调用​
snapshot_url = tos_client.pre_signed_url(tos.HttpMethodType.Http_Method_Get, bucket=bucket_name, key=video_key,​
query={"x-tos-process": video_process_style}, expires=3600)​
print("----- Generate Video Snapshot PreSignedURL Success ------")​
print(f"PreSignedURL: {snapshot_url.signed_url}")​
​
# 创建火山方舟客户端​
client = Ark(​
api_key=ARK_API_KEY,​
base_url="https://ark.cn-beijing.volces.com/api/v3",​
)​
print("----- Streaming Request -----")​
stream = client.chat.completions.create(​
model="ep-xxxxx-kxzmn", # 替换 model,填入 准备操作-在线推理 获取的 model​
messages=[​
{​
"role": "system",​
"content": "你是豆包,是由字节跳动开发的AI人工智能助手",​
},​
{​
"role": "user",​
"content": [​
{​
"type": "text",​
"text": "请用几个关键词解释一下这张图帮我解释一下这张图",​
},​
{"type": "image_url", "image_url": {"url": image_url.signed_url}}, # 传入TOS预签名后图片处理URL或者视频截帧URL​
],​
},​
],​
stream=True,​
)​
for chunk in stream:​
if not chunk.choices:​
continue​
print(chunk.choices[0].delta.content, end="")​
print()​
​
​
批量推理​
注意​
使用批量推理前,请确保您已经创建批量推理任务 Client,具体步骤,请参见构造 BatchInference Client。​
场景说明如下:​
  • 场景 1:TOS 不保存处理后的图片或视频截帧文件,即处理后的结果只作为模型的单次输入,无法重复使用。如您后续还想继续使用该图片,需要重新调用 TOS 处理,可能会产生一部分数据处理及请求等费用,详情请参见计费概述。​
  • 场景 2:使用图片处理持久化功能,将处理后的图片或视频截帧文件保存至 TOS,保存后即可重复使用。​
​
场景 1
场景 2
​
​
import base64​
import json​
import tos​
import uvloop​
from bytedance_ark_batch_inference.client import BatchInferenceClient​
​
def generate_image_urls(tos_client, bucket_name, image_keys, style, save_bucket, save_objects):​
image_urls = []​
​
for image_key, save_object in zip(image_keys, save_objects):​
tos_client.get_object(​
bucket=bucket_name,​
key=image_key,​
process=style,​
save_bucket=base64.b64encode(save_bucket.encode("utf-8")).decode("utf-8"),​
save_object=base64.b64encode(save_object.encode("utf-8")).decode("utf-8"),​
)​
​
image_url = tos_client.pre_signed_url(​
http_method=tos.HttpMethodType.Http_Method_Get,​
bucket=save_bucket,​
key=save_object,​
expires=3600​
)​
​
image_urls.append(image_url.signed_url)​
​
return image_urls​
​
def create_requests_json(image_urls):​
requests = []​
for i, image_url in enumerate(image_urls, start=1):​
request = {​
"custom_id": f"request-{i}",​
"body": {​
"messages": [​
{​
"role": "system",​
"content": "你是豆包,是由字节跳动开发的 AI 人工智能助手",​
},​
{​
"role": "user",​
"content": [​
{​
"type": "text",​
"text": "请用几个关键词解释一下这张图帮我解释一下这张图",​
},​
{​
"type": "image_url",​
"image_url": {"url": image_url},​
},​
],​
},​
],​
"max_tokens": 1000,​
"top_p": 1​
}​
}​
requests.append(request)​
​
return requests​
​
def create_tos_client(ak, sk, endpoint, region):​
return tos.TosClientV2(ak, sk, endpoint, region)​
​
def upload_json_to_tos(tos_client, input_bucket_name, object_key, json_data):​
json_bytes = json.dumps(json_data, ensure_ascii=False).encode('utf-8')​
tos_client.put_object(bucket=input_bucket_name, key=object_key, content=json_bytes)​
​
async def run_batch_inference(input_bucket_name, output_bucket_name, object_key, output_key):​
batch_inference_client = BatchInferenceClient()​
response = await batch_inference_client.create_batch_inference_job(input_bucket_name, output_bucket_name, object_key, output_key)​
response = await batch_inference_client.ListBatchInferenceJobs(['Running'])​
print('done')​
​
async def main():​
TOS_ACCESS_KEY = "Your Access Key"​
TOS_SECRET_KEY = "Your Secret Key"​
# 配置参数​
endpoint = "Your Endpoint"​
region = "Your Region"​
bucket_name = "Your Bucket"​
​
image_keys = ["image1.jpeg", "image2.jpeg", "image3.jpeg"] # 文件列表​
style = "image/resize,h_100/format,jpg"​
save_bucket = "Save Bucket" # 图片处理转存的桶名​
save_objects = ["temp1.jpeg", "temp2.jpeg", "temp3.jpeg"] # 对应的保存文件名列表​
input_key = "input.jsonl" # 批量推理输入文件,在TOS中存储的Key​
output_key = "output.jsonl" # 批量推理输出文件,在TOS中存储的Key​
​
​
​
tos_client = create_tos_client(TOS_ACCESS_KEY, TOS_SECRET_KEY, endpoint, region)​
​
# 生成图像URL​
image_urls = generate_image_urls(tos_client, bucket_name, image_keys, style, save_bucket, save_objects)​
​
# 创建请求JSON数据​
requests_data = create_requests_json(image_urls)​
​
# 上传JSON数据至TOS​
upload_json_to_tos(tos_client, bucket_name, input_key, requests_data)​
​
# 运行批量推理​
await run_batch_inference(bucket_name, bucket_name, input_key, output_key)​
​
if __name__ == '__main__':​
uvloop.run(main())​
​
​
TOS + 智能绘图模型​
下文以方舟图片生成模型 Doubao-Seedream 5.0 为例,介绍如何通过文生图模型生成图片,并将图片保存到 TOS 桶中,再进行图片处理。​
说明​
TOS 默认不保存处理后的图片,如您后续还想继续使用处理后的图片,需要重新调用 TOS 处理,可能会产生一部分数据处理及请求等费用,详情请参见计费概述。​
​
# coding:utf-8​
"""​
该代码示例展示了使用火山方舟图片生成模型【Doubao-Seedream 5.0】进行文字生成图片,​
并使用火山引擎的 TOS(对象存储服务)进行图片的存储、处理及 URL 生成。​
​
在运行此代码前,请确保已安装相应的 SDK,并开通方舟图片生成模型:​
1. `pip install --upgrade 'volcengine-python-sdk[ark]'`​
2. `pip install tos`​
3. `pip install requests`​
​
注意:请妥善保管您的密钥信息,避免泄露。​
"""​
from __future__ import print_function​
​
import requests​
import tos​
from volcenginesdkarkruntime import Ark​
​
# TOS 服务的访问密钥​
TOS_ACCESS_KEY = "Your Access Key"​
TOS_SECRET_KEY = "Your Secret Key"​
# 火山方舟的 API 密钥​
ARK_API_KEY = "Your ARK API Key"​
# 图片生成模型 ID,如 doubao-seedream-5-0-260128 / doubao-seedream-4-5-251128 / doubao-seedream-4-0-250828​
MODEL = "Your ARK Model"​
​
if __name__ == '__main__':​
# TOS 服务的相关配置​
endpoint = "Your Endpoint"​
region = "Your Region"​
bucket_name = "Your Bucket"​
image_obj_key = "test.jpeg"​
​
# 定义图片处理方式​
image_process_style = "image/resize,h_100/format,jpg"​
​
# 1. 调用方舟图片生成模型,文字生成图片​
client = Ark(​
api_key=ARK_API_KEY,​
base_url="https://ark.cn-beijing.volces.com/api/v3",​
)​
images_response = client.images.generate(​
model=MODEL,​
prompt="千军万马过独木桥,水墨意境,国风插画",​
size="2K",​
response_format="url",​
watermark=False,​
)​
origin_image_url = images_response.data[0].url​
print('Origin image url: ', origin_image_url)​
​
# 2. 将图片保存至 TOS​
# 创建 TOS 客户端并上传图片​
tos_client = tos.TosClientV2(TOS_ACCESS_KEY, TOS_SECRET_KEY, endpoint, region)​
# requests.get 获取网络流,python sdk 支持上传网络流​
# requests 返回的是一个可迭代对象(Iterable),此时 Python SDK 会通过 Chunked Encoding 方式上传。​
content = requests.get(origin_image_url, stream=True)​
result = tos_client.put_object(bucket_name, image_obj_key, content=content.raw)​
content.close()​
print('put object result code:{}'.format(result.status_code))​
​
# 3. 通过图片处理服务,处理生成的图片​
image_url = tos_client.pre_signed_url(tos.HttpMethodType.Http_Method_Get, bucket=bucket_name, key=image_obj_key,​
query={"x-tos-process": image_process_style}, expires=3600)​
print("----- Generate Image PreSignedURL Success ------")​
print(f"PreSignedURL: {image_url.signed_url}")​
​
​
TOS + 视频生成模型​
下文以方舟视频生成模型 Doubao-Seedance 2.0 为例,介绍将本地图片保存到 TOS 桶中,并进行图片处理,最后将处理后的图片通过方舟的 Doubao-视频生成-Seedance 视觉大模型,生成 5 秒的视频。​
​
# coding:utf-8​
"""​
该代码示例展示了使用火山方舟-【Doubao-视频生成-Seedance】进行图片生成视频,​
并使用火山引擎的 TOS(对象存储服务)进行图片的处理及 URL 生成。​
​
在运行此代码前,请确保已安装相应的 SDK,并开通火山方舟服务以及【Doubao-Seedance 2.0】视频生成大模型:​
1. `pip install --upgrade 'volcengine-python-sdk[ark]'`​
2. `pip install tos`​
​
注意:请妥善保管您的密钥信息,避免泄露。​
"""​
import time​
​
import tos​
from volcenginesdkarkruntime import Ark​
​
# 火山方舟的 API 密钥​
ARK_API_KEY = "Your ARK API Key"​
# 视频生成模型 ID,如 doubao-seedance-2-0-260128 / doubao-seedance-2-0-fast-260128 /​
# doubao-seedance-1-5-pro-251215 / doubao-seedance-1-0-pro-250528​
MODEL = "Your ARK Model"​
# 用户的访问密钥​
ACCESS_KEY = "Your Access Key"​
SECRET_KEY = "Your Secret Key"​
​
if __name__ == '__main__':​
# TOS 服务的相关配置​
endpoint = "Your Endpoint"​
region = "Your Region"​
bucket_name = "Your Bucket"​
image_obj_key = "test.jpeg"​
file_name = "test.jpeg"​
​
# 定义图片处理方式​
image_process_style = "image/resize,h_500/format,jpg"​
​
# 1. 初始化 tos client,并将图片上传到 tos 桶中​
tos_client = tos.TosClientV2(ACCESS_KEY, SECRET_KEY, endpoint, region)​
result = tos_client.put_object_from_file(bucket_name, image_obj_key, file_name)​
print('put object result code:{}'.format(result.status_code))​
​
# 2. 图片处理后获取文件下载预签名链接​
image_url = tos_client.pre_signed_url(tos.HttpMethodType.Http_Method_Get, bucket=bucket_name, key=image_obj_key,​
query={"x-tos-process": image_process_style}, expires=3600)​
​
print('image url after data process handle:{}'.format(image_url.signed_url))​
# 3. 将处理后的图片调用方舟视频生成模型生成视频​
client = Ark(api_key=ARK_API_KEY)​
create_result = client.content_generation.tasks.create(​
model=MODEL,​
content=[​
{​
# 文本提示词与参数组合​
"type": "text",​
"text": "千军万马过独木桥,大军缓缓走过桥梁,镜头缓缓拉出,桥下的水面波光粼粼 --ratio 16:9 --dur 5"​
},​
{​
# 图片 URL,作为首帧​
"type": "image_url",​
"image_url": {​
"url": image_url.signed_url​
},​
}​
]​
)​
print(create_result)​
​
print("----- get request -----")​
# 获取任务详情,一直等待任务完成,任务完成后视频地址在 content.video_url 中​
while True:​
get_result = client.content_generation.tasks.get(task_id=create_result.id)​
if get_result.status == "succeeded":​
print(get_result)​
break​
if get_result.status == "failed":​
print("视频生成失败:", get_result)​
break​
# sleep 一段时间​
print("火山方舟仍在生成视频,稍等...")​
time.sleep(5)​
​
​
​
​
​
最近更新时间:2026.09.10 19:06:23
这个页面对您有帮助吗?
有用
有用
无用
无用