目录
- 一、项目简介
- 概述
- 时间
- kaggle地址(代码和详细注解)
- 主要工作和收获
- 技术栈
- 数据集
- 结果
- 二、bug修复
- 在 Kaggle 使用模型时需要先同意该模型的使用条款
- 使用 GPU 时显存不足
- 把 Weaviate 从V3升级到V4
- 改动一:创建client
- 改动二:判断某个索引是否存在
- 改动三:聚合查询
- 改动四:带过滤条件的普通查询
- 使用 OpenAI 的 gpt-4 模型时报错
- OpenAI api调用超出限额
- 结论
- 三、kaggle 使用 Tips
- 查看每个cell的运行时间
- 将代码或者打印日志折叠和展开
- 注意 kaggle 免费 GPU 和 TPU 的使用限额
- Kaggle 上两种免费 GPU 该如何选择?
- 1. **NVIDIA Tesla P100**
- 2. **NVIDIA Tesla T4**
- 选择建议:
- 总结:
一、项目简介
概述
这是我的第3个AI项目,本项目使用 LlamaIndex 与 Gemma 以及 Weaviate 向量数据库构建高级 RAG 管道
时间
2024.09.08-2024.09.09
kaggle地址(代码和详细注解)
Advanced RAG with Gemma, Weaviate, and LlamaIndex
主要工作和收获
- 通过自定义类使用 Gemma 模型
- 在 Weaviate 中创建和使用向量存储(VectorStore),并将其与 llama_index 一起用于管理嵌入和索引。
- 构建了一个简单的 RAG查询引擎
- 构建了一个高级的 RAG查询引擎,用到了(自动检索、混合搜索、重新排序、Few-shot 提示)等高级RAG技术
- 把 Weaviate 从V3升级到V4,修复版本兼容bug
- 熟悉了 LlamaIndex 和 Weaviate 的使用
- 了解了openai api 调用可能存在的一些问题
技术栈
- 高级RAG技术,LlamaIndex,Weaviate,Gemma
数据集
2023-kaggle-ai-report
结果
因为openai 的api 需要付费调用,而我觉得自己现在的需求没有付费的必要,所以高级的 RAG查询引擎的部分功能(自动检索)没有真正跑通,不过原理和代码已经懂了,留着以后条件满足了再尝试,详细解释见我技术博客bug修复部分(OpenAI api调用超出限额)。
二、bug修复
在 Kaggle 使用模型时需要先同意该模型的使用条款
原作者代码运行到这行代码时报错了:
gemma_lm = keras_nlp.models.GemmaCausalLM.from_preset("gemma_instruct_2b_en")
报错信息:
BackendError: POST failed with: {"errors":["You must agree to the license on the model detail page: https://www.kaggle.com/models/keras/gemma"],"error":{"code":9,"details":[]},"wasSuccessful":false}
错误信息的意思是:我需要在使用 Kaggle 上的某个模型(这里是 Keras 模型 “gemma”)之前,同意其许可证。
解决方案:
打开报错中提到的链接:https://www.kaggle.com/models/keras/gemma。
在页面上查找并同意模型的许可证协议。如下图所示:
同意许可证后,右下角会跳出这个框,说明现在可以使用Gemma模型了。
使用 GPU 时显存不足
运行到这里报错了:
gemma_lm = keras_nlp.models.GemmaCausalLM.from_preset("gemma_instruct_2b_en")
错误信息:
ResourceExhaustedError: {{function_node __wrapped__Mul_device_/job:localhost/replica:0/task:0/device:GPU:0}} failed to allocate memory [Op:Mul] name:
ResourceExhaustedError: failed to allocate memory 错误通常是因为在使用 GPU 进行计算时,显存(GPU memory)不足,无法分配足够的内存来执行当前的操作。这种情况在处理大型模型或批处理数据时尤其常见。而且 Kaggle 的免费 GPU 有固定的显存限制,所以我可能需要优化代码(比如使用更小的模型)以减少显存占用。
解决方案有很多,不过我不想改动代码,因为我想到原作者代码是能跑的,没有出现这个错误,所以我怀疑不是模型过大导致的,而是自己之前的操作已经占用了大量显存,导致GPU显存不足。
解决方案:尝试重启 Kaggle Notebook 的内核(停止并重启 session),以释放所有 GPU 资源, 再跑一次就没有出现这个bug了。如果还不行,可以尝试切换到 TPU 试试。
把 Weaviate 从V3升级到V4
本来我想按照上一个项目的解决思路,通过指定版本号来安装各个包,且版本号都保持和原作者一样,这样就可以在不改动代码(兼容原作者Weaviate-client 3.x版本代码)的情况下跑起来了。但是我发现原作者下面三个包采用了静默安装(-q),导致这三个包没有安装日志,所以没法从日志里找到对应的版本号。我又尝试了用距离原作者notebook发布日期(2024-01-30)最近的版本号来替代,但是还是出现了各种版本兼容报错。
!pip install -q -U keras-nlp
!pip install -q -U keras>3
!pip install -q -U llama_index
解决方案:所以我决定把作者 weaviate 3.x的代码升级到4.x,这样所有的安装包都可以采用最新版本了,而且kaggle环境也采用最新环境(Always use latest environment)。
参考weaviate官方迁移文档 Migrate from v3 to v4,我做了下面代码的修改:
改动一:创建client
v3代码
import weaviate
from weaviate.embedded import EmbeddedOptions
client = weaviate.Client(embedded_options=EmbeddedOptions())
v4代码
import weaviate
client = weaviate.connect_to_embedded()
改动二:判断某个索引是否存在
v3代码
if client.schema.exists(index_name):
client.schema.delete_class(index_name)
v4代码
collections = client.collections.list_all()
if index_name in collections:
client.collections.delete(index_name)
改动三:聚合查询
v3代码
client.query.aggregate(index_name).with_meta_count().do()
v4代码
client.collections.get(index_name).aggregate.over_all(total_count=True)
改动四:带过滤条件的普通查询
v3代码
response = (
client.query
.get(index_name, ["text"])
.with_where({
"path": ["competition_title"],
"operator": "Equal",
"valueText": "Google - Isolated Sign Language Recognition"
})
.with_limit(2)
.do()
)
print(json.dumps(response, indent=4))
v4代码
from weaviate.classes.query import Filter
response = client.collections.get(index_name).query.fetch_objects(
filters=Filter.by_property("competition_title").equal("Google - Isolated Sign Language Recognition"),
limit=2
)
for o in response.objects:
print(o.properties)
升级完后,bug就修复了。
使用 OpenAI 的 gpt-4 模型时报错
报错是自动检索(元数据过滤)的那一块代码的最后一行:
import openai
from llama_index.llms.openai import OpenAI
from kaggle_secrets import UserSecretsClient
user_secrets = UserSecretsClient()
openai.api_key = user_secrets.get_secret("OPENAI_API_KEY")
retriever = VectorIndexAutoRetriever(
index,
llm = OpenAI(model="gpt4"),
vector_store_info=vector_store_info,
similarity_top_k = 4,
vector_store_query_mode="hybrid",
alpha=0.5,
verbose=True
)
response = retriever.retrieve(sample_query)
错误信息:
NotFoundError: Error code: 404 - {'error': {
'message': 'The model `gpt-4` does not exist or you do not have access to it.',
'type': 'invalid_request_error', 'param': None, 'code': 'model_not_found'}}
该错误说明我在尝试使用 OpenAI 的 gpt-4
模型时遇到了问题。我想到可能是权限问题,免费用户可能只能用 gpt-3.5-turbo ,所以我改用了 gpt-3.5-turbo ,改动代码如下:
llm = OpenAI(model="gpt-3.5-turbo"),
上面的错误解决了,又报出了下面另一个bug。
OpenAI api调用超出限额
错误信息如下:
RateLimitError: Error code: 429 - {'error': {
'message': 'You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.',
'type': 'insufficient_quota', 'param': None, 'code': 'insufficient_quota'}}
这个错误说明我的 OpenAI api 调用超出限额,我看了一下错误信息里提到的网址:Error Code 429 - You exceeded your current quota, please check your plan and billing details.
文档里说:此错误消息表示您已达到 API 的最高月度预算。这意味着您已使用分配给您的计划的所有信用或单位,并且已达到结算周期的限制。
于是我查了下各个时间周期的限制到底是多少,见文档:rate-limits
我是免费用户,我看下图限额好像还比较高啊,我感觉自己根本没有调用几次,应该没有达到限额才对。
然后我看了下自己账户的usage情况:usage。
我发现自己好像有5美金的免费额度,而且一点都没有使用,如下图
不过需要注意左上角,这是 project api 的情况,而不是user api 的 使用
project api 和 user api 的区别见下图
我很困惑,自己明明调用了api,上图却显示没有任何api调用呢,而且还有5美金额度,于是我上网查了下,找到这个帖子:
openai-api-error-429-you-exceeded-your-current-quota-please-check-your-plan-a
原来我不是付费用户,不应该看usage页面(这是付费用户看的),而应该看billing 页面,我发现自己确实没有免费试用额度了,虽然我根本没有用过,我猜可能根本没有送或者之前送了过期了,见下图:
解决方案很简单:就是付费。
但是我暂时不打算付费用 openai 的api。因为我认为后面工作的话不太会用到这个,公司里用的肯定是自己微调的免费开源的大模型,一般不会愿意用openai的api,毕竟比较贵。所以我应该把时间和精力花在免费开源大模型上面。
那么能否用其他模型替代gpt4来实现自动检索呢?
我尝试了用gemma模型来替代gpt4模型。
结果在同样的地方又报错了,错误信息不同:
ValidationError: 2 validation errors for VectorStoreQuerySpec
query
Field required [type=missing, input_value={'$defs': {'FilterOperato...Spec', 'type': 'object'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.8/v/missing
filters
Field required [type=missing, input_value={'$defs': {'FilterOperato...Spec', 'type': 'object'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.8/v/missing
该错误 ValidationError
表示我在使用 VectorStoreQuerySpec
时,必需的 query
和 filters
字段未提供。
于是我查了下 VectorStoreQuerySpec
并结合下面文档,找出了报错的真正原因
Auto-Retrieval from a Weaviate Vector Database
这个文档里有句话如下:
We will be using GPT-4 for its reasoning capabilities to infer the metadata filters. Depending on your use case, “gpt-3.5-turbo” can work as well.
意思是:LlamaIndex在自动检索技术的示例中,之所以选择GPT-4(gpt-3.5-turbo也行)模型,是因为GPT-4才有能力根据用户提问自动推断出metadata filters(元数据过滤条件),而我尝试用来替换GPT-4的 gemma 模型还不具备这个能力,所以才导致在调用
VectorStoreQuerySpec
时,必需的query
和filters
字段未提供。
gpt-4自动推断出的 query
和 filters
是这样的:
Using query str: good backbone for the Kaggle competition
Using filters: [('competition_title', '==', 'Feedback Prize - English Language Learning')]
除了gemma 模型,我猜其他开源免费的大模型应该也不具备自动检索的能力,所以LlamaIndex官网才会在自动检索技术的示例中使用需要付费的GPT-4 api来实现而不是其他免费的模型。我查了下LLaMA 2也是需要微调和提示工程(prompt engineering)才具备这个功能。
当然,我可以尝试通过适当的微调和提示工程(prompt engineering)来让gemma 或者LLaMA 2模型具备这个能力,但是实现起来会比较复杂的也比较耗时,而且微调和提示工程(prompt engineering)是我后面项目要学的,现在超出了我的能力范围,而且也不是我这个项目的目标。
结论
这个项目到底为止,自动检索功能就先不测试跑通了,毕竟自己已经知道了原理、思路和实现代码。
1.等后面更需要用到 openai api 的时候,我再付费测试一下就好了。
2.或者等我后面学会大模型微调,而且后面项目也确实有必要实现这个功能的时候,我再来尝试用其他开源大模型来实现这个功能。
三、kaggle 使用 Tips
查看每个cell的运行时间
在cell开始时加上这行代码就可以了,wall time 就是cell的运行时间
%%time
将代码或者打印日志折叠和展开
注意 kaggle 免费 GPU 和 TPU 的使用限额
有两种GPU可以选,共用免费限额时间,一周免费时间是30小时,TPU只有一种,是20小时,我一周才过了两天,就使用了9小时了,总之建议大家省着点用,不用的时候就关掉session,多注意kaggle 右边栏的 GPU使用情况。
Kaggle 上两种免费 GPU 该如何选择?
在 Kaggle 上,Tesla P100 和 Tesla T4 是两种常见的免费 GPU,它们各有优点,具体选择要根据你的任务需求来决定。以下是它们的对比:
1. NVIDIA Tesla P100
- 架构: Pascal
- CUDA 核心数: 3584
- 内存带宽: 732 GB/s
- 显存: 16 GB HBM2
- 计算性能: 更适合需要较大计算资源的任务,比如大规模的深度学习模型训练,尤其是卷积神经网络(CNN)。
2. NVIDIA Tesla T4
- 架构: Turing
- CUDA 核心数: 2560
- Tensor 核心: 320 个,支持混合精度(FP16、FP32),对 AI 推理任务有加速效果
- 内存带宽: 320 GB/s
- 显存: 16 GB GDDR6
- 计算性能: T4 支持更高效的推理(Inference)计算,因此在模型推理、轻量化模型训练(例如 BERT 微调)、混合精度计算上可能会表现得更好。
选择建议:
- 训练大型模型(例如深度 CNN、需要大量显存的模型):Tesla P100 更好,因为它的内存带宽更高、CUDA 核心数更多。
- 推理任务或轻量化训练(例如 NLP 模型的推理和微调、BERT 等 Transformer 模型):Tesla T4 更好,尤其是在你使用混合精度时,它的 Tensor 核心可以显著加速计算。
总结:
- 如果你主要做 大规模模型训练,建议选择 Tesla P100。
- 如果你做 推理、轻量化训练 或 使用混合精度 进行加速,建议选择 Tesla T4。
你可以根据项目的需求在两者之间切换。