Skip to content

M27300: 模型整理

http://cs101.openjudge.cn/practice/27300/

深度学习模型(尤其是大模型)是近两年计算机学术和业界热门的研究方向。每个模型可以用 “模型名称-参数量” 命名,其中参数量的单位会使用两种:M,即百万;B,即十亿。同一个模型通常有多个不同参数的版本。例如,Bert-110M,Bert-340M 分别代表参数量为 1.1 亿和 3.4 亿的 Bert 模型,GPT3-350M,GPT3-1.3B 和 GPT3-175B 分别代表参数量为 3.5亿,13亿和 1750 亿的 GPT3 模型。参数量的数字部分取值在 [1, 1000) 区间(一个 8 亿参数的模型表示为 800M 而非 0.8B,10 亿参数的模型表示为 1B 而非 1000M)。计算机专业的学生小 A 从网上收集了一份模型的列表,他需要将它们按照名称归类排序,并且同一个模型的参数量从小到大排序,生成 “模型名称: 参数量1, 参数量2, ...” 的列表。请你帮他写一个程序实现。

输入

第一行为一个正整数 n(n <= 1000),表示有 n 个待整理的模型。

接下来 n 行,每行一个 “模型名称-参数量” 的字符串。模型名称是字母和数字的混合。

输出

每行一个 “模型名称: 参数量1, 参数量2, ...” 的字符串,符号均为英文符号,模型名称按字典序排列,参数量按从小到大排序。

样例输入

5
GPT-1.3B
Bert-340M
GPT-350M
Bert-110M
GPT-175B

样例输出

Bert: 110M, 340M
GPT: 350M, 1.3B, 175B

提示

tags: string, sort

来源: 2023fall zyn

参数量都换算到统一的量纲(例如“以 B 为单位”) 再比较

python
from collections import defaultdict

class llm:
    def __init__(self, fullname: str) -> None:
        self.name, self.m = fullname.split('-')
        self.unit = self.m[-1]
        self.num = float(self.m[:-1])
        # 转换为统一单位:B(十亿)
        if self.unit == 'M':
            self.value = self.num / 1000
        else:
            self.value = self.num

    def __lt__(self, other):
        return self.value < other.value


d = defaultdict(list)
n = int(input())
for i in range(n):
    l = llm(input())
    d[l.name].append(l)

names = sorted(d.keys())
for i in names:
    llms = sorted(d[i])
    print(f'{i}: {", ".join([j.m for j in llms])}')

【戴嘉震, 24EECS】定义一个 ParamSize 类,继承 str,专门用于定义模型大小的排序。

python
from collections import defaultdict

class ParamSize(str):
    def __lt__(self, other):
        metri_self = self[-1]
        metri_other = other[-1]
        if metri_other == metri_self:
            num_self = float(self[:-1])
            num_other = float(other[:-1])
            return num_self < num_other
        if metri_self == 'M':
            return True
        else:
            return False


models = defaultdict(list)
n = int(input())
for _ in range(n):
    s = input().split('-')
    models[s[0]].append(ParamSize(s[1]))
for key in sorted(models.keys()):
    print(f"{key}: {', '.join(sorted(models[key]))}")
python
from collections import defaultdict

n = int(input())
d = defaultdict(list)
for _ in range(n):
    #name, para = input().strip().split('-')
    name, para = input().split('-')
    if para[-1]=='M':
        d[name].append((para, float(para[:-1])/1000) )
    else:
        d[name].append((para, float(para[:-1])))


sd = sorted(d)
#print(d)
for k in sd:
    paras = sorted(d[k],key=lambda x: x[1])
    #print(paras)
    value = ', '.join([i[0] for i in paras])
    print(f'{k}: {value}')