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}')