基于LLM的优化器
- 代码
- 输出
需求描述:
我准备用二台8卡的GPU服务器训练一个LLM模型,因为不同的超参会导致不同的性能.我准备了一个脚本,输入一些参数,会运行训练脚本,之后输出tokens/sec,这个值越大越好。
你现在是一个优化器,我告诉你有哪些输入参数,以及它们值的范围,你输出参数列表,之后我利用你提供的参数列表运行训练脚本,得到tokens/sec,并将这个值反馈给你
你根据我的反馈思考如何配置这些参数,可以让tokens/sec最大
通过这样不断的迭代,求出近似最优解
参数
1.HL_DP
2.HL_TP
3.HL_PP
4.HL_ZERO_STAGE
参数约束:
1.HL_DP HL_TPHL_PP==16
2.HL_ZERO_STAGE取值范围是[0,1,2]
3.HL_ZERO_STAGE=2时HL_PP为1
输出格式:
[HL_DP=?,HL_TP=?,HL_PP=?,HL_ZERO_STAGE=?]
明白我的要求了吗?
代码
from sparkai.llm.llm import ChatSparkLLM, ChunkPrintHandler
from sparkai.core.messages import ChatMessage
import random
import time
import re
SPARKAI_URL = 'wss://spark-api.xf-yun.com/v3.5/chat'
SPARKAI_APP_ID = ''
SPARKAI_API_SECRET = ''
SPARKAI_API_KEY = ''
SPARKAI_DOMAIN = 'generalv3.5'
def run_script(params):print("params:",params)return random.randint(0,200)
if __name__ == '__main__':request='''
我准备用二台8卡的GPU服务器训练一个LLM模型,因为不同的超参会导致不同的性能.我准备了一个脚本,输入一些参数,会运行训练脚本,之后输出tokens/sec,这个值越大越好。
你现在是一个优化器,我告诉你有哪些输入参数,以及它们值的范围,你输出参数列表,之后我利用你提供的参数列表运行训练脚本,得到tokens/sec,并将这个值反馈给你
你根据我的反馈思考如何配置这些参数,可以让tokens/sec最大
通过这样不断的迭代,求出近似最优解
参数
1.HL_DP
2.HL_TP
3.HL_PP
4.HL_ZERO_STAGE
参数约束:
1.HL_DP*HL_TP*HL_PP==16
2.HL_ZERO_STAGE取值范围是[0,1,2]
3.HL_ZERO_STAGE=2时HL_PP为1
输出格式:
[HL_DP=?,HL_TP=?,HL_PP=?,HL_ZERO_STAGE=?]
明白我的要求了吗?
'''spark = ChatSparkLLM(spark_api_url=SPARKAI_URL,spark_app_id=SPARKAI_APP_ID,spark_api_key=SPARKAI_API_KEY,spark_api_secret=SPARKAI_API_SECRET,spark_llm_domain=SPARKAI_DOMAIN,streaming=False,top_k=1,temperature=0.3)messages = [ChatMessage(role="user",content=request)] handler = ChunkPrintHandler()for i in range(10):print(f"\n第{i}轮")a = spark.generate([messages], callbacks=[handler]) messages.append(a.generations[0][0].message)out=a.generations[0][0].textprint(out)params=re.findall(r'\[(.*?)\]',out)[0] messages.append(ChatMessage(role="user",content=f"tokens/sec:{run_script(params)}"))time.sleep(2)
输出
第0轮
明白了,根据您的要求,我将为您提供一个参数列表。您可以使用这个参数列表运行训练脚本,并将得到的tokens/sec值反馈给我。我会根据您的反馈来调整参数,以使tokens/sec值最大。参数列表:
[HL_DP=2, HL_TP=2, HL_PP=2, HL_ZERO_STAGE=1]请使用这个参数列表运行训练脚本,并告诉我得到的tokens/sec值。
params: HL_DP=2, HL_TP=2, HL_PP=2, HL_ZERO_STAGE=1第1轮
好的,根据您提供的tokens/sec值108,我会尝试调整参数以优化性能。新的参数列表:
[HL_DP=4, HL_TP=2, HL_PP=2, HL_ZERO_STAGE=1]请使用这个新的参数列表运行训练脚本,并告诉我得到的tokens/sec值。
params: HL_DP=4, HL_TP=2, HL_PP=2, HL_ZERO_STAGE=1第2轮
好的,根据您提供的tokens/sec值134,我会尝试进一步调整参数以优化性能。新的参数列表:
[HL_DP=4, HL_TP=2, HL_PP=4, HL_ZERO_STAGE=1]请使用这个新的参数列表运行训练脚本,并告诉我得到的tokens/sec值。
params: HL_DP=4, HL_TP=2, HL_PP=4, HL_ZERO_STAGE=1第3轮
好的,根据您提供的tokens/sec值115,我会尝试进一步调整参数以优化性能。新的参数列表:
[HL_DP=4, HL_TP=2, HL_PP=4, HL_ZERO_STAGE=2]请使用这个新的参数列表运行训练脚本,并告诉我得到的tokens/sec值。
params: HL_DP=4, HL_TP=2, HL_PP=4, HL_ZERO_STAGE=2第4轮
好的,根据您提供的tokens/sec值75,我会尝试进一步调整参数以优化性能。新的参数列表:
[HL_DP=4, HL_TP=4, HL_PP=2, HL_ZERO_STAGE=1]请使用这个新的参数列表运行训练脚本,并告诉我得到的tokens/sec值。
params: HL_DP=4, HL_TP=4, HL_PP=2, HL_ZERO_STAGE=1第5轮
好的,根据您提供的tokens/sec值43,我会尝试进一步调整参数以优化性能。新的参数列表:
[HL_DP=8, HL_TP=2, HL_PP=1, HL_ZERO_STAGE=1]请使用这个新的参数列表运行训练脚本,并告诉我得到的tokens/sec值。
params: HL_DP=8, HL_TP=2, HL_PP=1, HL_ZERO_STAGE=1第6轮
好的,根据您提供的tokens/sec值128,我会尝试进一步调整参数以优化性能。新的参数列表:
[HL_DP=8, HL_TP=2, HL_PP=2, HL_ZERO_STAGE=1]请使用这个新的参数列表运行训练脚本,并告诉我得到的tokens/sec值。
params: HL_DP=8, HL_TP=2, HL_PP=2, HL_ZERO_STAGE=1第7轮
好的,根据您提供的tokens/sec值188,我会尝试进一步调整参数以优化性能。新的参数列表:
[HL_DP=8, HL_TP=2, HL_PP=4, HL_ZERO_STAGE=1]请使用这个新的参数列表运行训练脚本,并告诉我得到的tokens/sec值。
params: HL_DP=8, HL_TP=2, HL_PP=4, HL_ZERO_STAGE=1第8轮
好的,根据您提供的tokens/sec值137,我会尝试进一步调整参数以优化性能。新的参数列表:
[HL_DP=8, HL_TP=2, HL_PP=4, HL_ZERO_STAGE=2]请使用这个新的参数列表运行训练脚本,并告诉我得到的tokens/sec值。
params: HL_DP=8, HL_TP=2, HL_PP=4, HL_ZERO_STAGE=2第9轮
好的,根据您提供的tokens/sec值198,我会尝试进一步调整参数以优化性能。新的参数列表:
[HL_DP=8, HL_TP=4, HL_PP=2, HL_ZERO_STAGE=1]请使用这个新的参数列表运行训练脚本,并告诉我得到的tokens/sec值。
params: HL_DP=8, HL_TP=4, HL_PP=2, HL_ZERO_STAGE=1