Py学习  »  Python

AI模型生成Python并行脚本测试

气象学家 • 10 月前 • 277 次点击  

封面/Pixabay

作者/孙刺猬


前言

现在我本人有几个可访问的AI模型(免费且无需科学上网),就对他们的代码编写能力进行了简单测试/测评。

目前参与测试的包含:

  • 印象笔记的印象AI 
  • LAION 的 Open Assistant
  • 科大讯飞的星火(Spark)
  • 昆仑的天工(SkyWork)
  • 百度的文心一言(ERNIE)


另外也请小伙伴帮忙测试了下OpenAI的ChatGPT(3.5版)作为对照

在独立的初始会话中测试如下prompt:

请使用Python实现下述功能:4核并行;使用multiprocessing库;在 /user/aaa/files/ 路径下有 AAA.*.txt 文件一千多个,对每一个文件:输出文件名,用函数 load_data() 读取其中数据(此函数不需要你编写),使用函数 plot_data() 进行绘图(此函数不需要你编写);输出程序运行时间;每个并行进程单独使用文件保存日志;脚本中包含注释


实际我在代码中修改路径,根据我的环境改成了 '/Users/XXX/data/temp/' (问话时象征性保护信息)。

放了九个名字比较随机的文件,AAA.1.txt AAA.2.txt … AAA.142.txt,里面随便打了两列数值。

prompt中增加“(此函数不需要你编写)”是因为有AI不够智能没有理解清我的意图,花了大精力在那俩函数上。实际中真碰到这情况也应该是细化要求,那我干脆就在提示中加上了。

结果

各家的结果先贴出来,如果不想细看可以直接跳到下一部分——“总结”,会有整体的对比表。



  • 印象笔记


我自己是印象笔记高级账户,除了开源的Open Assistant不需要额外申请外,也是印象笔记先给我AI用(他家甚至不搞什么“测试”,直接全线上线!就冲这个胆识也要夸一夸~),所以把他放第一个

印象笔记的AI助手是全线推开的,只要使用最新版本app(必须是桌面版,移动端还不行)“超级笔记”就能调用。

有token限制,但我没记住具体是多少。

import os
import time
import multiprocessing as mp
# 加载数据函数
def load_data(file_path):
    # 此函数不需要编写,这里只是简单的示例
    with open(file_path, 'r') as f:
        data = f.readlines()
    return data
# 绘图函数
def plot_data(file_path, data):
    # 此函数不需要编写,这里只是简单的示例
    import matplotlib.pyplot as plt
    plt.plot(data)
    plt.savefig(file_path + '.png')
# 处理单个文件的函数
def process_file(file_path, log_file_path):
    start_time = time.time()
    # 读取数据
    data = load_data(file_path)
    # 绘制图形
    plot_data(file_path, data)
    # 记录日志
    with open(log_file_path, 'w') as f:
        f.write("Processed {} in {:.2f} seconds".format(file_path, time.time() - start_time))
# 主函数
if __name__ == '__main__':
    # 设置路径和文件名模式
    path = '/Users/XXX/data/temp/'
    file_pattern = 'AAA.*.txt'    
    # 获取文件列表
    file_list = [os.path.join(path, f) for f in os.listdir(path) if f.endswith('.txt') and f.startswith('AAA')]
    # 创建日志文件夹
    log_folder = os.path.join(path, 'logs')
    if not os.path.exists(log_folder):
        os.makedirs(log_folder)
    # 设置进程池大小
    pool = mp.Pool(processes=4)
    # 处理每个文件
    for file_path in file_list:
        log_file_path = os.path.join(log_folder, os.path.basename(file_path) + '.log')
        pool.apply_async(process_file, args=(file_path, log_file_path))
    # 关闭进程池
    pool.close()
    # 等待所有进程完成
    pool.join()
    # 输出程序运行时间
    print("Total time: {:.2f} seconds".format(time.time() - start_time))


简评:

  • 结果竟然相当好!
  • 只需要补个 start_time 就齐活
  • 文件搜索完整,路径补充合理,日志按处理文件名保存,并行逻辑完整
  • 要是注释和上一行代码间能默认加个空行就更好了,看起来不费眼


  • Open Assistant


这个是完全开源的工具,还可以每天上去贡献点儿训练和标定样本,我挺看好他的,开源大  法好~!

不过目前中文占比还是太少了,经常问他个中文问题,他虽然看懂了但拿英文回答,让他翻译成中文或用中文回答也不一定顶用。

建议大家没事也多去搞俩任务做做,早日让他中文妥了~~

https://open-assistant.io/

当然,细说的话他家模型不只一个,甚至自己可以定制一些参数。但这里咱仅从使用角度出发,默认是啥就用啥~(而且我也确实不知道啥模型效果最好嘛)

如果不想注册,不想做任务做贡献,HuggingFace也接入了他家AI,点开就能用:

https://huggingface.co/chat/

 

import multiprocessing as mp
from datetime import timedelta


def process(file):
    start = time.time()
    filename, ext = os.path.splitext(os.path.basename(file))
    
    data = load_data(file) # replace with your own load_data function
    result = plot_data(data) # replace with your own plot_data function
    
    end = time.time()
    run_time = "{:.2f}s".format(end - start)
    
    print("Processed {} in {}. Data saved to file.".format(filename, run_time))
    
if __name__ == '__main__':
    files = [f for f in os.listdir("/Users/XXX/data/temp/"if f.startswith('AAA') and f.endswith('.txt')]
    chunksize = len(files) // 4
    processes = []
    
    for i in range(0, len(files), chunksize):
        chunk = files[i:i + chunksize]
        
        p = mp.Process(target=process, args=(chunk,))
        p.start()
        processes.append(p)
        
    for p in processes:
        p.join()

简评:

  • 说不用他写,还真就连个口子也不留了,哈哈
  • 有文件筛选,但是没有补全路径
  • 在并行部分搞得比较复杂,做了 chunksize  判断,但是造成参数传递 chunk 和 file 不一致的问题,需要从逻辑上再修改,比如把process里的file搞成filelist啥的,本来比较简单的问题给复杂化了
  • 也没做啥日志
  • 缺库 os


  • 星火


这是科大讯飞搞的大预言模型,申请-通过 流程比较快,是需要申请内测的几个中最早给我内测资格的。

因为科大本身做语言识别、翻译等不错,想来也有优势。

https://xinghuo.xfyun.cn/

import multiprocessing as mp
import time
import numpy as np
from matplotlib import pyplot as plt


def load_data(file_path):
    # 读取文件数据的函数,根据实际情况编写
    return data


def plot_data(data):
    # 绘图函数,根据实际情况编写
    plt.plot(data)
    plt.show()


if __name__ == '__main__':
    # 获取文件路径列表
    dir_path = '/Users/XXX/data/temp/'
    fileNames = [fn for fn in os.listdir(dir_path) if fn.endswith('AAA.*.txt')]
    num_cores = mp.cpu_count() # 获取CPU核心数
    tic = time.time() # 记录程序开始时间
    results = [] # 结果列表,用于保存每个文件的结果
    for i, file_name in enumerate(fileNames):
        # 对于每个文件,创建一个进程并运行load_data和plot_data函数
        p = mp.Process(target=lambda: (load_data(os.path.join(dir_path, file_name)), plot_data(load_data(os.path.join(dir_path, file_name)))))
        p.start() # 启动进程
        results.append((p, i)) # 将进程对象和文件名添加到结果列表中
        p.join() # 等待进程结束
    tic = time.time()-tic # 计算程序运行时间
    print('Total time taken: {} seconds'.format(tic)) # 输出程序运行时间
    for result in results:
        result[1] += num_cores # 每个进程使用不同的文件保存日志,因此需要将文件名加1以便对应不同的文件。这里使用result[1]作为文件名。

简评:

  • 文件有路径补全,但筛选无效
  • 缺库 os
  • 并行逻辑有问题,p.join 放在循环里,这种似是而非的代码能把初学者整死……
  • 让他用4核,用了mp.cpu_count(),但后面用的是mp.Process 不是 mp.Pool 相当于num_cores就没用到,虚晃我一枪
  • 最后似乎是没生成完整,但大家都公平点儿,不给他额外机会了



  • 天工


这是昆仑搞的模型,在发公布会的时候敢直接搞现场演示,可以说自己底气很足呀。

他家给内测也比较干脆,而且是在MacOS下(Windows未测试)少数能区分 【输入法的回车】和【聊天框的回车】的。(比如我中文输入法中希望打个import,需要出来选项后点回车键或者shift键,此时容易一点回车直接把半截内容发给AI…)。

https://neice.tiangong.cn/

import multiprocessing as mp
import time


def load_data(file_path):
    # 读取文件数据,此处省略
    pass


def plot_data(data):
    # 绘制数据
    pass


def main():
    # 设置进程数为4
    num_processes = 4
    
    # 设置每个进程的工作目录
    work_dir = f'/Users/XXX/data/temp/'
    
    # 创建进程列表
    processes = [mp.Process(target=load_data, args=(work_dir+'/'+file_name, )) for file_name in os.listdir(work_dir)]
    
    # 创建一个进程管理器,用于控制进程的启动和停止
    process_manager = mp.Manager()
    
    # 创建一个文件,用于记录进程的日志
    log_file = open(f'{work_dir}/log.txt''a')
    
    # 启动所有进程
    for process in processes:
        process.start()
        process.join()
    
    # 关闭所有进程
    for process in processes:
        process.terminate()
    
    # 输出程序运行时间
    end_time = time.time()
    print('程序运行时间:', end_time - start_time)
    
    # 关闭进程管理器
    process_manager.shutdown()
    
    # 关闭日志文件
    log_file.close()


if __name__ == '__main__':
    start_time = time.time()
    main()
    end_time = time.time()
    print('程序运行时间:', end_time - start_time)

简评:

  • 流程中丢了plot_data
  • 文件名加了路径,但没做筛选
  • 有保存日志,但没有分开做
  • 代码结构很好看
  • 并行逻辑不好,声明4核但无效,每个进程都直接 process.join
  • 缺了os库



  • 文心一言


百度家的,让我排了老久的队才给的测试资格……

https://yiyan.baidu.com/

直接看结果吧

import multiprocessing  
import os  
import time  
  
def load_data(filename):  
    # 从文件中读取数据,可以根据具体的数据格式进行修改  
    data = []  
    with open(filename, 'r') as f:  
        for line in f:  
            data.append(line.strip())  
    return data  
  
def plot_data(data, title, x_axis, y_axis):  
    # 绘制数据的图形  
    import matplotlib.pyplot as plt  
    plt.plot(x_axis, y_axis, label='Data')  
    plt.xlabel('X-axis')  
    plt.ylabel('Y-axis')  
    plt.title(title)  
    plt.legend()  
    plt.show()  
  
def run_script():  
    # 初始化进程池  
    pool = multiprocessing.Pool(processes=4)  
  
    # 并行读取数据,可以使用循环进行处理  
    for filename in os.listdir('/Users/XXX/data/temp/'):  
        if filename.endswith('.txt'):  
            data = load_data(filename)  
            pool.apply_async(plot_data, args=(data, 'Data''X-axis''Y-axis'))  
  
    # 关闭进程池  
    pool.close()  
    pool.join()  
  
    # 输出程序运行时间  
    print('Script finished in {} seconds'.format(time.time() - start_time))  
  
if __name__ == '__main__':  
    start_time = time.time()  
    run_script()

简评:

  • 没有补全文件路径,文件筛选不全
  • 想要串行读数据,并行做绘图处理
  • 并行的逻辑基本完整
  • 没有保存日志



  • ChatGPT-3.5


这是大家熟悉的了,就不做说明。

但我没有账号,是请同事帮忙测的

import multiprocessing  
import os  
import time  
  
import os
import time
import multiprocessing

# 定义文件路径和要保存日志的文件夹路径
file_path = "/Users/XXX/data/temp/"
log_path = "/Users/XXX/data/temp/"


# 加载数据函数(不需要编写)
def load_data(file):
    # 加载文件中的数据
    with open(file, "r") as f:
        data = f.read()
    return data


# 绘图函数(不需要编写)
def plot_data(file, data):
    # 绘制数据图表
    # 在这里,你可以使用你自己的绘图代码
    pass


# 并行处理文件函数
def process_file(file):
    # 获取文件名
    file_name = os.path.basename(file)

    # 加载数据
    data = load_data(file)

    # 绘制数据图表
    plot_data(file_name, data)

    # 记录运行时间
    end_time = time.time()

    # 保存日志
    with open(os.path.join(log_path, f"{file_name}.log"), "w") as f:
        f.write(f"Processing {file_name} took {end_time - start_time} seconds")

if __name__ == "__main__":
    # 获取所有.txt文件的列表
    files = [os.path.join(file_path, f) for f in os.listdir(file_path) if f.endswith(".txt")]

    # 开始时间
    start_time = time.time()

    # 创建进程池
    pool = multiprocessing.Pool(processes=4)

    # 并行处理所有文件
    pool.map(process_file, files)

    # 关闭进程池
    pool.close()
    pool.join()

    # 结束时间
    end_time = time.time()

    # 输出程序运行时间
    print(f"Total time: {end_time - start_time} seconds")import os
import time
import multiprocessing

# 定义文件路径和要保存日志的文件夹路径
file_path = "/Users/XXX/data/temp/"
log_path = "/Users/XXX/data/temp/"


# 加载数据函数(不需要编写)
def load_data(file):
    # 加载文件中的数据
    with open(file, "r") as f:
        data = f.read()
    return data


# 绘图函数(不需要编写)
def plot_data(file, data):
    # 绘制数据图表
    # 在这里,你可以使用你自己的绘图代码
    pass


# 并行处理文件函数
def process_file(file):
    # 获取文件名
    file_name = os.path.basename(file)

    # 加载数据
    data = load_data(file)

    # 绘制数据图表
    plot_data(file_name, data)

    # 记录运行时间
    end_time = time.time()

    # 保存日志
    with open(os.path.join(log_path, f"{file_name}.log"), "w") as f:
        f.write(f"Processing {file_name} took {end_time - start_time} seconds")

if __name__ == "__main__":
    # 获取所有.txt文件的列表
    files = [os.path.join(file_path, f) for f in os.listdir(file_path) if f.endswith(".txt")]

    # 开始时间
    start_time = time.time()

    # 创建进程池
    pool = multiprocessing.Pool(processes=4)

    # 并行处理所有文件
    pool.map(process_file, files)

    # 关闭进程池
    pool.close()
    pool.join()

    # 结束时间
    end_time = time.time()

    # 输出程序运行时间
    print(f"Total time: {end_time - start_time} seconds")def load_data(filename):  
    # 从文件中读取数据,可以根据具体的数据格式进行修改  
    data = []  
    with open(filename, 'r') as f:  
        for line in f:  
            data.append(line.strip())  
    return data  
  
def plot_data(data, title, x_axis, y_axis):  
    # 绘制数据的图形  
    import matplotlib.pyplot as plt  
    plt.plot(x_axis, y_axis, label='Data')  
    plt.xlabel('X-axis')  
    plt.ylabel('Y-axis')  
    plt.title(title)  
    plt.legend()  
    plt.show()  
  
def run_script():  
    # 初始化进程池  
    pool = multiprocessing.Pool(processes=4)  
  
    # 并行读取数据,可以使用循环进行处理  
    for filename in os.listdir('/Users/XXX/data/temp/'):  
        if filename.endswith('.txt'):  
            data = load_data(filename)  
            pool.apply_async(plot_data, args=(data, 'Data''X-axis''Y-axis'))  
  
    # 关闭进程池  
    pool.close()  
    pool.join()  
  
    # 输出程序运行时间  
    print('Script finished in {} seconds'.format(time.time() - start_time))  
  
if __name__ == '__main__':  
    start_time = time.time()  
    run_script()

简评:

  • 文件做了筛选,但不完整
  • process_file 函数中的 start_time 未定义
  • 整体格式很好,用pool.map 也是我最开始想的比较方便的操作
  • 日志什么的也按要求做了


结果

把一些条目列出来整合比较一下

如果让我排个序,排名是这样的:

  • 印象笔记
  • ChatGPT-3.5
  • 文心一言
  • 天工
  • 星火
  • Open Assistant


Open Assistant 的拉胯我是没想到的,可能和我用中文提问有关?但在具体使用时肯定中文方便。

印象笔记的牛我是万万没有想到的!我之前用他试过很多生成介绍、段落概述啥的,感觉能力一般,现在我对他好感可是特别高~

其他几家国产大模型还有不少有待提高的地方……至少在代码生成这方面,单次提供复杂提示,目前给出的结果不尽人意……



-----广告赞助商-----







声明:欢迎转载、转发本号原创内容,可留言区留言或者后台联系小编(微信:gavin7675)进行授权。气象学家公众号转载信息旨在传播交流,其内容由作者负责,不代表本号观点。文中部分图片来源于网络,如涉及作品内容、版权和其他问题,请后台联系小编处理。


往期推荐

 获取ERA5-Land陆面高分辨率再分析数据(32TB)

 1942-2022年中国地面气象站观测数据免费分享

 获取全球GPM降水数据,半小时/逐日(4TB)

 获取1998-2019 TRMM 3B42逐日降水数据

★ 获取最新版本CMIP6降尺度数据集30TB

★ 获取ERA5常用变量再分析数据26TB

 EC数据商店推出Python在线处理工具箱

★ EC打造实用气象Python工具Metview

★  机器学习简介及在短临天气预警中的应用

★ Nature-地球系统科学领域的深度学习及理解

★ 采用神经网络与深度学习来预报降水、温度

★ 灵魂拷问:ChatGPT对气象人的饭碗是福是祸?

★ 气象局是做啥的?气象局的薪水多少?

★  一位气象学家尝试ChatGPT复现Nature子刊的研究,他真的会面临失业吗?!


   欢迎加入气象学家交流群   

请备注:姓名/昵称-单位/学校-研究方向




Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/154907
 
277 次点击