googleapis / googleapis/python-genai

slow memory leak

Open
#1,258 4 comments 3 reactions 1 assignee Claimed by @Venkaiahbabuneelam View on GitHub
priority: p3 type: bug
Dominant language
Python
Stars
4k
Forks
1k
Avg merge
2d 11h
Merged PRs (30d)
40

Description

**Describe the bug**
hi,friends, i have tested a case for 2 days, and the python process may had a memory leak ?I need to use the genai
SDK on the server side.
By "memory_profiler" tool, the memory always increased near " async for response in responses"
i don't know how to analysis the cause of the problem, any advice will be appreciate!!!

the RES memory data by every test is here:
```
pmem(rss=345006080, vms=458731520, shared=16035840, text=3551232, lib=0, data=404234240, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347435008, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347705344, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347705344, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347705344, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347705344, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347705344, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347705344, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347705344, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347705344, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347705344, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347705344, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347705344, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347705344, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
pmem(rss=347705344, vms=460619776, shared=16162816, text=3551232, lib=0, data=406122496, dirty=0)
```

rss from 347435008 grow to 347705344

To Reproduce

```
import asyncio
import psutil
from google.oauth2 import service_account
from memory_profiler import profile
from google import genai
from google.genai import types

genai_safety_settings = [types.SafetySetting(
category="HARM_CATEGORY_HATE_SPEECH",
threshold="BLOCK_NONE"
),types.SafetySetting(
category="HARM_CATEGORY_DANGEROUS_CONTENT",
threshold="BLOCK_NONE"
),types.SafetySetting(
category="HARM_CATEGORY_SEXUALLY_EXPLICIT",
threshold="BLOCK_NONE"
),types.SafetySetting(
category="HARM_CATEGORY_HARASSMENT",
threshold="BLOCK_NONE"
)]

@profile(precision=4)
async def generate(i):
context = '''
XXX [Time Range] XXX [Position] 工作总结 - XXX [Name]工作内容概述本阶段,我主要负责XXX [工作范围],涵盖了从XXX到XXX的多个关键环节。具体工作包括XXX [职责一]、XXX [职责二]、以及XXX [职责三]等。作为团队的一员,我积极参与了XXX [项目/任务],并在其中扮演了XXX [角色],致力于达成XXX [目标]。工作成果与亮点在过去的工作中,我取得了以下主要成果: XXX项目成功实施:作为核心成员,我全程参与了XXX [项目名称]项目。在该项目中,我负责XXX [具体职责],通过XXX [方法/技术],成功解决了XXX [遇到的问题],最终使项目在XXX [时间]内按时上线,并超预期实现了XXX [具体指标,如效率提升X%,成本降低X%,用户满意度提升X%等]。该项目为公司带来了XXX [价值,如新增客户X家,营收增长X元等]。 流程优化与效率提升:我主动分析并识别了XXX [现有流程]中存在的XXX [问题点],并提出了XXX [改进方案]。经过团队协作,我们成功实施了该方案,使XXX [相关流程]的效率提升了XXX%,显著缩短了XXX [时间/周期],减少了XXX [资源消耗],为团队节约了XXX [具体数字]的工时。 技术创新与应用:在日常工作中,我积极探索并引入了XXX [新技术/工具],如XXX [具体技术名称],并将其应用于XXX [具体场景]。通过XXX [创新应用方式],成功解决了XXX [技术难题],提升了XXX [系统性能/产品质量],使XXX [某项指标]达到了XXX [具体数值]。 客户/用户满意度提升:我积极响应客户/用户需求,处理了XXX [具体数量]的反馈和问题,通过XXX [服务方式],成功解决了XXX [具体问题],获得了XXX [具体数量]的积极评价。根据XXX [数据来源],客户/用户满意度达到了XXX%。存在问题与改进方向在取得成绩的同时,我也清醒地认识到工作中仍存在一些不足和挑战: XXX [问题一]:在XXX [具体工作]方面,我发现XXX [具体表现],导致XXX [负面影响]。例如,在处理XXX [案例]时,由于XXX [原因],未能达到预期的XXX [结果]。 改进方向:针对此问题,我计划在接下来的工作中加强XXX [学习/实践],借鉴XXX [方法/经验],并寻求XXX [协助/指导],力争在XXX [时间]内将该问题彻底解决,提升XXX [相关能力]。 XXX [问题二]:在XXX [具体领域]方面,我的XXX [能力/知识]仍有待提升。XXX [具体例子]表明,我在面对XXX [复杂情况]时,显得有些XXX [不足之处]。 改进方向:我将利用业余时间系统学习XXX [相关知识],参加XXX [培训/研讨会],并积极参与XXX [实践项目],争取在XXX [时间]内弥补短板,更好地应对未来的挑战。 XXX [问题三]:在XXX [合作/沟通]方面,我有时会遇到XXX [具体问题],影响了XXX [团队协作效率]。 改进方向:我将主动与同事进行XXX [沟通方式]交流,增强XXX [换位思考能力],并尝试XXX [改进措施],以期建立更加高效顺畅的合作关系。未来规划与展望展望未来,我将继续秉持XXX [核心价值观],努力提升自身综合能力,为团队和公司的发展贡献更多力量。 短期目标(未来3-6个月): 完成XXX [具体任务],争取在XXX [时间]内达到XXX [具体指标]。 深入学习XXX [新知识/技能],并在XXX [项目/工作]中加以实践应用。 积极参与XXX [团队活动/公司项目],提升XXX [协作能力/综合素质]。 长期规划(未来1-3年): 在XXX [专业领域]成为XXX [专家/骨干],能够独立承担XXX [重要职责]。 通过XXX [途径],持续提升XXX [核心竞争力],适应行业发展变化。 培养XXX [领导力/管理能力],为团队带来更大的价值,争取晋升至XXX [职位]。 对公司的建议: 建议公司可以考虑XXX [具体建议],以进一步提升XXX [效率/竞争力]。 建议加强XXX [方面]的培训和学习机会,帮助员工不断成长。我坚信,在公司领导的正确指引和同事们的共同努力下,我将能够克服现有挑战,实现既定目标,与公司共同发展,创造更加辉煌的未来。
'''
userPrompt = '''

Generate an outline from the given context (text, documents, images). Your goal is to summarize the context in English.

'''
contents=[userPrompt, context]
try:
model_id = "gemini-2.5-flash"
client = genai.Client(
vertexai=True,
project=project_id,
location="us-central1",
credentials=credentials
)
llmConfig = types.GenerateContentConfig(
response_modalities=["TEXT"],
safety_settings = genai_safety_settings,
max_output_tokens = 65535,
temperature = 0,
top_p = 0.8,
top_k = 40,
thinking_config= types.ThinkingConfig(
thinking_budget = 0
)
)

responses = await client.aio.models.generate_content_stream(
model = model_id,
contents = contents,
config = llmConfig,
)
async for response in responses:
print(f"response={response}")
except Exception as e:
print(e)

async def test():
for i in range(50):
await generate(i)
process = psutil.Process()
memory_info = process.memory_info()
print(memory_info)

if __name__ == "__main__":

loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(test())
loop.close()

```
**Expected behavior**
The memory is in a relatively stable state,not increases so obviously.

**Python Version**
Python 3.11.0

**google-genai version**
google-genai==1.29.0

**psutil version**
7.0.0

**memory_profiler version**
0.61.0

**OS Version**
Ubuntu 20.04.6

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.