diff --git a/README.md b/README.md index 28f4efd1..f8020077 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ xmake && xmake install - 运行模型推理测试 ```bash -python scripts/jiuge.py [--cpu | --nvidia | --qy | --cambricon | --ascend | --metax | --moore | --iluvatar | --kunlun | --hygon] path/to/model_dir [n_device] +python scripts/jiuge.py [--cpu | --nvidia | --qy | --cambricon | --ascend | --metax | --moore | --iluvatar | --kunlun | --hygon | --ali] path/to/model_dir [n_device] ``` - 部署模型推理服务 @@ -63,6 +63,12 @@ python scripts/test_ppl.py --model-path MODEL_PATH [--ndev NDEV] [--max-batch MA ``` + - 选择是否使用九齿计算路径,默认为false,即不依赖九齿算子 + ```bash + xmake f --ninetoothed= [true | false] -cv + ``` + + - 安装 InfiniLM Python 包 ```bash pip install -e . @@ -71,11 +77,11 @@ python scripts/test_ppl.py --model-path MODEL_PATH [--ndev NDEV] [--max-batch MA - 单次推理测试 - llama示例 ```bash - python examples/llama.py [--cpu | --nvidia | --qy | --metax | --moore | --iluvatar | --ali] --model_path= + python examples/jiuge.py [--cpu | --nvidia | --qy | --metax | --moore | --iluvatar | --ali | --cambricon | --hygon] --model_path= ``` - 例如: ```bash - python examples/llama.py --nvidia --model_path=/models/TinyLlama-1.1B-Chat-v1.0 + python examples/jigue.py --nvidia --model_path=/models/TinyLlama-1.1B-Chat-v1.0 ``` - 分布式推理测试 - 9g示例 @@ -113,7 +119,7 @@ python scripts/test_ppl.py --model-path MODEL_PATH [--ndev NDEV] [--max-batch MA - 运行推理基准测试(C-Eval/MMLU) ```bash - python test/bench/test_benchmark.py [--cpu | --nvidia | --cambricon | --ascend | --metax | --moore | --iluvatar | --kunlun | --hygon] --bench {ceval|mmlu} [--backend cpp] [--ndev N] [--subject SUBJECT] [--num_samples N] [--max_new_tokens N] [--output_csv PATH] [--cache_dir PATH] + python test/bench/test_benchmark.py [--cpu | --nvidia | --cambricon | --ascend | --metax | --moore | --iluvatar | --kunlun | --hygon | --ali] --bench {ceval|mmlu} [--backend cpp] [--ndev N] [--subject SUBJECT] [--num_samples N] [--max_new_tokens N] [--output_csv PATH] [--cache_dir PATH] ``` - 参数说明: diff --git a/csrc/cache/kv_cache.cpp b/csrc/cache/kv_cache.cpp index 9c3f0bcc..04f5e54c 100644 --- a/csrc/cache/kv_cache.cpp +++ b/csrc/cache/kv_cache.cpp @@ -93,26 +93,24 @@ StaticKVCache::update(size_t layer_idx, auto device = k_cache_layer->device(); - if (device.getType() == infinicore::Device::Type::NVIDIA - || device.getType() == infinicore::Device::Type::ILUVATAR - || device.getType() == infinicore::Device::Type::METAX) { - infinicore::op::kv_caching_( - k_cache_layer, - v_cache_layer, - k, - v, - past_sequence_lengths); - } else { - size_t cache_pos = reinterpret_cast(past_sequence_lengths->to(infinicore::Device::cpu())->data())[0]; - auto result_len = cache_pos + update_len; - ASSERT(result_len <= cache_len_); - - auto k_cache_update = k_cache_layer->narrow({{2, cache_pos, update_len}}); - auto v_cache_update = v_cache_layer->narrow({{2, cache_pos, update_len}}); - - k_cache_update->copy_from(k); - v_cache_update->copy_from(v); - } +#ifdef ENABLE_NINETOOTHED + infinicore::op::kv_caching_( + k_cache_layer, + v_cache_layer, + k, + v, + past_sequence_lengths); +#else + size_t cache_pos = reinterpret_cast(past_sequence_lengths->to(infinicore::Device::cpu())->data())[0]; + auto result_len = cache_pos + update_len; + ASSERT(result_len <= cache_len_); + + auto k_cache_update = k_cache_layer->narrow({{2, cache_pos, update_len}}); + auto v_cache_update = v_cache_layer->narrow({{2, cache_pos, update_len}}); + + k_cache_update->copy_from(k); + v_cache_update->copy_from(v); +#endif return {k_cache_layer, v_cache_layer}; } diff --git a/csrc/models/llama/llama_mlp.cpp b/csrc/models/llama/llama_mlp.cpp index a3ab7859..282e2eca 100644 --- a/csrc/models/llama/llama_mlp.cpp +++ b/csrc/models/llama/llama_mlp.cpp @@ -71,19 +71,34 @@ LlamaMLP::LlamaMLP(std::shared_ptr model_config, } infinicore::Tensor LlamaMLP::forward(const infinicore::Tensor &hidden_states) const { - // 1. Project to gate and up - auto hidden_states_mutable = hidden_states; - auto [gate, up] = gate_up_proj_->forward_split(hidden_states_mutable); + infinicore::Device::Type dev_type = hidden_states->device().getType(); + if(dev_type == infinicore::Device::Type::MOORE){ + // 1. Project to a single combined gate_up tensor + auto hidden_states_mutable = hidden_states; + auto gate_up = gate_up_proj_->forward(hidden_states_mutable); - // 2. Apply SwiGLU: silu(gate) * up - // Note: swiglu kernel expects (up, gate) and computes gate * sigmoid(gate) * up - // So we pass (up, gate) to get the correct result: gate * sigmoid(gate) * up - auto intermediate = infinicore::op::swiglu(up, gate); + // 2. Apply the fused silu_and_mul operator + // applies SiLU to the first half, and multiplies it by the second half. + // Mathematically equivalent to: result = SiLU(gate_up[..., :d]) * gate_up[..., d:] + auto intermediate = infinicore::op::silu_and_mul(gate_up); - // 3. Project down - auto output = down_proj_->forward(intermediate); + // 3. Project down + auto output = down_proj_->forward(intermediate); + return output; + } else{ + // 1. Project to gate and up + auto hidden_states_mutable = hidden_states; + auto [gate, up] = gate_up_proj_->forward_split(hidden_states_mutable); - return output; + // 2. Apply SwiGLU: silu(gate) * up + // Note: swiglu kernel expects (up, gate) and computes gate * sigmoid(gate) * up + // So we pass (up, gate) to get the correct result: gate * sigmoid(gate) * up + auto intermediate = infinicore::op::swiglu(up, gate); + + // 3. Project down + auto output = down_proj_->forward(intermediate); + return output; + } } } // namespace infinilm::models::llama diff --git a/examples/bench.py b/examples/bench.py index 3f9de226..9ce53138 100644 --- a/examples/bench.py +++ b/examples/bench.py @@ -167,6 +167,11 @@ def get_args(): action="store_true", help="Run alippu test", ) + parser.add_argument( + "--hygon", + action="store_true", + help="Run hygon test", + ) parser.add_argument( "--model", type=str, @@ -237,12 +242,13 @@ def get_args(): parser.add_argument( "--warmup", action="store_true", - help="Perform a warmup run before benchmarking/inference." + help="Perform a warmup run before benchmarking/inference.", ) return parser.parse_args() -prompt = "泰山,又名岱山、岱宗、岱岳、东岳、泰岳,为五岳之一,有“五岳之首”、“五岳独尊”、“天下第一山”、“华夏神山”之称 ,被中外学者称为“中国的奥林匹斯山” 位于山东省中部,隶属于泰安市,绵亘于泰安、济南、淄博三市之间,总面积25000公顷,主峰玉皇顶海拔约1545米。泰山相伴上下五千年的华夏文明传承历史,集国家兴盛、民族存亡的象征于一身,是中华民族的精神家园 [31],东方文化的缩影,“天人合一”思想的寄托之地 [24],承载着丰厚的地理历史文化内涵 [15],被古人视为“直通帝座”的天堂,成为百姓崇拜,帝王告祭的神山,有“泰山安,四海皆安”的说法 [1]。自秦始皇起至清代,先后有13代帝王亲登泰山封禅或祭祀,另有24代帝王遣官祭祀72次。山体上既有寺庙、宫、观等古建筑群29处,古遗址128处,有大小碑碣、摩崖石刻2000余处 [15]。其景巍峨雄奇、幽奥俊秀,有石坞松涛、云海玉盘等美丽壮阔的自然景观。其历史文化、自然风光、地质奇观和谐融为一体,具有特殊的历史、文化、美学和科学价值。 [19]1982年,泰山被列入第一批国家级风景名胜区。1987年,泰山被联合国教科文组织批准列为全球首例世界文化与自然双重遗产 [14] [41-42]。2002年,泰山被评为“中华十大文化名山”之首 [15]。2005年,泰山成为国家地质公园。2006年,泰山因其独特的地质价值成为世界地质公园 [14]。2007年3月,泰山被评为国家AAAAA级旅游景区;12月,泰山被命名为中国首座“中国书法名山”。2025年3月20日,泰山迎来2025年第100万名游客。" +with open("examples/bench_prompt.md", "r") as f: + prompt = f.read() def repeat_prompt(input_ids: list[int], target_length: int): @@ -287,13 +293,13 @@ def __init__( # 创建 tokenizer # ---------------------------------------------------------------------------- # tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True) - + if tokenizer.pad_token is None: if tokenizer.eos_token is not None: tokenizer.pad_token = tokenizer.eos_token tokenizer.pad_token_id = tokenizer.eos_token_id else: - tokenizer.add_special_tokens({'pad_token': '[PAD]'}) + tokenizer.add_special_tokens({"pad_token": "[PAD]"}) # ---------------------------------------------------------------------------- # # token编码 @@ -312,9 +318,8 @@ def __init__( input_content, padding=True, truncation=True, - max_length=2048, - return_tensors="pt" - ) + max_length=8192, + ) input_ids_list = encoding["input_ids"] @@ -349,6 +354,7 @@ def run( top_k=top_k, top_p=top_p, temperature=temperature, + stop_on_eos=False, ), _measure_and_log_time=True, ) @@ -386,6 +392,8 @@ def run( device_str = "mlu" elif args.ali: device_str = "cuda" + elif args.hygon: + device_str = "cuda" else: print( "python examples/bench.py --nvidia --model=~/TinyLlama-1.1B-Chat-v1.0/ --batch-size=2 --tp=1 --input-len=50 --output-len=50" @@ -459,10 +467,7 @@ def run( ) ) - avg_prompt_len = min( - 64, - max(len(ids) for ids in test.input_ids_list) - ) + avg_prompt_len = min(64, max(len(ids) for ids in test.input_ids_list)) warmup_ids = [ ids[:avg_prompt_len] if len(ids) >= avg_prompt_len else ids @@ -477,10 +482,11 @@ def run( _ = test.model.generate( input_ids_infini, GenerationConfig( - max_new_tokens=5, # decode kernel warmup + max_new_tokens=5, # decode kernel warmup temperature=args.temperature, top_k=args.top_k, top_p=args.top_p, + stop_on_eos=False, ), _measure_and_log_time=False, ) @@ -495,7 +501,6 @@ def run( # Warmup done # ---------------------------------------------------------------------------- # - for idx, case in tqdm(cases_dict.items(), desc="Processing cases"): tqdm.write(f"\033[92mProcessing : {case}\033[0m") diff --git a/examples/bench_prompt.md b/examples/bench_prompt.md new file mode 100644 index 00000000..9b71850c --- /dev/null +++ b/examples/bench_prompt.md @@ -0,0 +1,19 @@ +泰山,又名岱山、岱宗、岱岳、东岳、泰岳,为五岳之一,有“五岳之首”、“五岳独尊”、“天下第一山”、“华夏神山”之称,被中外学者称为“中国的奥林匹斯山”。它位于山东省中部,隶属于泰安市,绵亘于泰安、济南、淄博三市之间,总面积25000公顷,主峰玉皇顶海拔约1545米。这座雄伟的山脉,以其磅礴的气势和深厚的内涵,横亘在齐鲁大地上,成为中华民族精神家园中无可替代的坐标。泰山相伴上下五千年的华夏文明传承历史,集国家兴盛、民族存亡的象征于一身,是中华民族的精神家园,东方文化的缩影,“天人合一”思想的寄托之地,承载着丰厚的地理历史文化内涵,被古人视为“直通帝座”的天堂,成为百姓崇拜,帝王告祭的神山,有“泰山安,四海皆安”的说法。自秦始皇起至清代,先后有13代帝王亲登泰山封禅或祭祀,另有24代帝王遣官祭祀72次。山体上既有寺庙、宫、观等古建筑群29处,古遗址128处,有大小碑碣、摩崖石刻2000余处。其景巍峨雄奇、幽奥俊秀,有石坞松涛、云海玉盘等美丽壮阔的自然景观。其历史文化、自然风光、地质奇观和谐融为一体,具有特殊的历史、文化、美学和科学价值。1982年,泰山被列入第一批国家级风景名胜区。1987年,泰山被联合国教科文组织批准列为全球首例世界文化与自然双重遗产。2002年,泰山被评为“中华十大文化名山”之首。2005年,泰山成为国家地质公园。2006年,泰山因其独特的地质价值成为世界地质公园。2007年3月,泰山被评为国家AAAAA级旅游景区;12月,泰山被命名为中国首座“中国书法名山”。2025年3月20日,泰山迎来2025年第100万名游客。 +要真正理解泰山,必须首先从它的地理形胜与地质传奇开始。泰山崛起于华北平原之东,巍然矗立于齐鲁大地之上,其形成的历史可追溯至二十八亿年前的太古代时期。那时,这里还是一片浩瀚的海洋,地壳运动如同巨人的手掌,将海底的沉积岩层层挤压、褶皱、抬升,历经沧海桑田的巨变,终于在大约三千万年前的喜马拉雅造山运动中,奠定了今日泰山的雏形。泰山地区的岩石,以片麻岩、花岗岩和闪长岩为主,这些古老的岩石记录了地球童年时代的记忆,它们是整个华北地区最古老的地层之一,被地质学家称为“泰山杂岩”。登临泰山,抚摸那布满斑驳纹路的石壁,仿佛能够触碰到时间的骨骼,感受到地球脉动的余温。 +泰山的地貌格局,呈现出一种阶梯状上升的特征。从山脚的泰安城,海拔仅有二十余米,到中天门海拔八百余米,再到南天门的一千四百余米,最后抵达玉皇顶的一千五百四十五米,每一级台阶都是地质力量的杰作。泰山的山势陡峭而雄伟,但并不显得孤傲与冷漠。它像一位端坐的巨人,既有威严刚毅的面容,也有宽厚仁慈的胸怀。泰山的主峰玉皇顶,因建有玉皇庙而得名,立于其上,极目远眺,只见群山拱卫,众水朝宗,天高地迥,宇宙无穷。孔子“登泰山而小天下”的慨叹,杜甫“会当凌绝顶,一览众山小”的诗句,皆由此生发。这种视觉上的震撼与心理上的升华,正是泰山地理形胜给予世人最直接的馈赠。 +泰山的自然景观,堪称一部恢弘壮丽的交响乐章。四季更替为泰山披上不同的盛装,春日山花烂漫,夏日绿荫如盖,秋日红叶满山,冬日银装素裹。而最令人叹为观止的,当属泰山的四大奇观:泰山日出、云海玉盘、晚霞夕照、黄河金带。黎明时分,站在日观峰上,东方地平线渐渐泛起鱼肚白,须臾间,一道红光喷薄而出,继而半圆形、扇形的金色光芒四射,最后一轮红日跃出云海,天地为之色变。这壮丽的日出景象,自古以来就是帝王封禅告祭的神圣时刻,也是无数游人心驰神往的精神洗礼。若逢雨过天晴,云海便会悄然铺陈,茫茫云涛如素绢白纱,群峰若隐若现,宛如海上仙山。而当夕阳西下,晚霞映照山峦,整座泰山便笼罩在一片金红交织的光晕之中,瑰丽不可方物。更为罕见的是黄河金带,在天气极其晴朗的日子,站在泰山之巅向西眺望,但见黄河如一条金色的丝带,蜿蜒于天际之间,这是大自然赐予泰山独有的殊荣。 +泰山的植被资源极为丰富,森林覆盖率高达百分之八十以上,拥有各类植物一千余种。从山麓的侧柏林,到山腰的油松林,再到山顶的灌丛草甸,垂直分布的植被带谱清晰分明。其中,最负盛名的当属泰山“三大奇观”之一的“石坞松涛”。在后石坞,古松参天而立,枝干虬曲盘错,风过处,松涛阵阵,如万马奔腾,如海潮涌动,这苍茫的松声与古老的岩石相互唱和,奏响了泰山自然乐章中最雄浑的低音。还有那千年汉柏,相传为汉武帝封禅泰山时所植,至今依然枝繁叶茂,气宇轩昂,见证了无数王朝的更迭与岁月的流转。这些古树名木,是泰山活着的文物,也是自然与历史交融的绿色丰碑。 +如果说自然地理赋予了泰山的骨骼与容颜,那么历史文化则注入了泰山的魂魄与神韵。泰山的历史,是一部浓缩的中华文明史。早在远古时期,泰山就被先民视为通天的神山。大汶口文化和龙山文化的考古发现表明,泰山周围是新石器时代中华先民重要的活动区域,他们在此繁衍生息,观察天象,祭祀山川,开启了泰山崇拜的源头。进入文明时代后,泰山更是被赋予了无与伦比的政治与文化内涵。历代帝王将泰山视为江山社稷的象征,天下太平的符瑞,于是便有了绵延数千年的封禅大典。 +封禅,是泰山独有的、最高规格的国家祭祀大典。所谓“封”,是指在泰山之巅筑土为坛,祭天以报天之功;所谓“禅”,是指在泰山脚下的小山辟基扫地为场,祭地以报地之功。这一仪式并非寻常帝王可为,必须是改朝换代、功成治定、天下太平之后,才有资格告成于天。公元前二一九年,秦始皇统一六国后,率领文武大臣,跋涉千里,登上泰山,行封禅礼,刻石颂德,成为历史上有明确记载的第一位封禅泰山的帝王。此后,汉武帝八次东巡,六次封禅,将泰山祭祀推向鼎盛。汉武帝在泰山立碑无字,任后人评说功过,其胸襟气度,至今令人感慨。汉光武帝刘秀、唐高宗李治与武则天、唐玄宗李隆基、宋真宗赵恒等帝王,都曾在泰山举行过规模宏大的封禅仪式。那些封禅台遗址、御帐坪遗址、古登封台遗址,至今依然静卧在山林之间,虽已荒草丛生,却依然能够唤起人们对那个恢弘时代的追忆与想象。 +除了帝王封禅,历代的文人墨客、名士高僧也在泰山留下了深深的足迹。孔子登泰山而感叹“苛政猛于虎”,这里是他“小天下”的思想高地;司马迁在《史记》中浓墨重彩地记载封禅大典,泰山成为他史笔之下的神圣坐标;曹植、陆机、李白、杜甫、苏轼、元好问,历代诗坛巨擘无不为泰山挥毫泼墨,留下传诵千古的华章。李白“天门一长啸,万里清风来”的豪放,杜甫“造化钟神秀,阴阳割昏晓”的凝练,早已镌刻在每一个中国人的文化记忆之中。明代大旅行家徐霞客两登泰山,其游记成为后世探寻泰山的重要文献。清代康熙、乾隆二帝,更是对泰山情有独钟,康熙帝撰写《泰山龙脉论》,从风水学的角度阐释泰山与国家兴衰的关系;乾隆帝一生十一次登临泰山,留下了大量的诗碑御笔,至今仍能在山间寻见其墨宝。 +泰山更是一座无与伦比的书法艺术宝库。从山麓至山巅,古道两侧,崖壁之上,碑碣林立,刻石遍布,两千余处摩崖石刻如同一部镌刻在山石之上的中国书法史。经石峪的《金刚经》摩崖石刻,是北齐僧人的杰作,每字径尺,隶楷参半,浑厚苍古,被尊为“大字鼻祖”、“榜书之宗”。唐玄宗的《纪泰山铭》,洋洋千言,镌于大观峰崖壁之上,隶书端庄雄浑,盛唐气象扑面而来。还有秦代李斯小篆残碑,虽仅存数字,却是“书同文”历史变革的实物见证。宋代米芾“第一山”的洒脱,明代张钦“观海”的飘逸,清代刘墉、铁保、阮元等名家的墨迹,以及近现代孙中山、毛泽东、郭沫若等伟人的题词,构成了跨越两千余年的书法艺术长廊。登泰山,不仅是身体的跋涉,更是一场与历代先贤跨越时空的对话,每一步都踏在历史的回响之上。 +泰山的人文景观建筑,同样体现了中国古代建筑艺术的卓越成就。以岱庙为核心的泰山古建筑群,是中国现存规模最大、保存最完整的古代山岳祭祀建筑群之一。位于泰山南麓的岱庙,旧称东岳庙,是历代帝王祭祀泰山神的地方,其建筑规制完全仿照帝王宫殿的格局。天贶殿是岱庙的主体建筑,与北京故宫太和殿、曲阜孔庙大成殿并称中国古代三大宫殿式建筑。殿内供奉东岳大帝神像,四壁绘有著名的《泰山神启跸回銮图》,画中人物六百有余,山川林木、宫殿车马,气势恢宏,是宋代壁画的瑰宝。从岱庙向北,沿着绵延九公里的登山御道,分布着红门宫、万仙楼、斗母宫、壶天阁、中天门、五松亭、对松亭、南天门等数十处古建筑。这些建筑依山就势,巧妙利用地形,与自然山水浑然一体,将漫长的登山路线串联成一条神圣的天梯。尤其是十八盘,一千六百余级石阶如同天梯倒挂,两侧悬崖壁立,登临其上,真有“天门云梯”之感。而当穿过南天门,踏上“天街”,仿佛真的走进了天庭仙界,那种精神上的升华与震撼,是任何语言都难以尽述的。 +泰山民俗文化同样源远流长,丰富多彩。泰山石敢当的信仰习俗,遍及海内外华人社区。那一方方镌刻着“石敢当”或“泰山石敢当”字样的石碑,立于村口巷尾、桥头路冲,用以镇宅辟邪、保境安民,至今已有一千余年的传承历史。泰山老奶奶碧霞元君的信仰,更是深入人心。碧霞元君是泰山女神,宋真宗封禅泰山时发现玉女石像,敕建昭真祠供奉,后世累加封号,至明代已成为华北地区影响最大的女神信仰。每年农历四月的东岳庙会,香客云集,商贾辐辏,戏曲杂耍,百戏纷呈,是泰山民俗文化的集中展示。至今,依然有无数的善男信女,不远千里,徒步登山,朝拜碧霞元君,延续着这份源自古老时代的虔诚与敬畏。 +泰山还承载着中华民族融合团结的历史记忆。汉武帝泰山封禅时,南越、东越、西域诸国使节皆随行同祭,显示了大一统王朝的包容与气度。唐代文成公主入藏和亲,行前专程遣使祭祀泰山,祈求国家安宁、民族和睦。金元时期,少数民族统治者入主中原后,同样延续了泰山祭祀的传统,金世宗、元世祖都曾遣官致祭,泰山成为民族融合的文化象征。明永乐年间,女真首领阿哈出率部族朝贡明成祖于泰山脚下,成为东北边疆归附中央的历史见证。泰山见证了中华民族多元一体格局的形成与发展,是各民族文化认同的共同精神家园。 +泰山的文化内涵,还体现在它作为“国山”地位的最终确立。从先秦时期“泰山岩岩,鲁邦所瞻”的诗篇,到汉代“泰山不让土壤,故能成其大”的哲理,再到宋代范仲淹“先天下之忧而忧,后天下之乐而乐”的名句与泰山精神的契合,泰山已不仅仅是一座地理意义上的山,而是国家社稷、民族精神的象征。当国家危难之际,仁人志士常以泰山自励,文天祥“人生自古谁无死,留取丹心照汗青”的铮铮铁骨,于谦“粉骨碎身浑不怕,要留清白在人间”的凛然正气,无不折射出泰山所象征的坚贞不屈。抗日战争时期,泰山成为鲁中抗日根据地的坚强屏障,八路军将士在泰山周边与日寇浴血奋战,书写了可歌可泣的英雄篇章。冯玉祥将军隐居泰山期间,积极宣传抗日救亡,其墓至今安卧在泰山之麓,与山河同在,与日月同辉。1949年中华人民共和国成立后,泰山作为中华民族精神的象征,受到了前所未有的保护与尊崇。泰山被列为国家重点风景名胜区,岱庙、泰山古建筑群被列入全国重点文物保护单位。泰山所承载的自强不息、厚德载物、国泰民安的文化精神,成为中华民族伟大复兴的精神动力。 +泰山的文化与自然价值获得了国际社会的高度认可。1987年,联合国教科文组织世界遗产委员会将泰山列入世界文化与自然双重遗产名录,这是全球首例获此殊荣的项目。世界遗产委员会的评语写道:“泰山在近两千年的历史中,一直是中国艺术家和学者的精神源泉,是古代中国文明与信仰的象征。”这一评价精准地概括了泰山在世界文明格局中的独特地位。2006年,泰山因其独特的地质构造、典型的地质遗迹和重要的地质历史记录,被批准为世界地质公园。至此,泰山成为中国唯一拥有世界文化、自然、地质三重国际桂冠的名山。这是泰山的荣耀,也是中华文明对人类文明宝库作出的杰出贡献。 +进入新时代,泰山的保护与传承工作进入了新的历史阶段。面对每年数百万游客的登山朝圣,如何平衡遗产保护与旅游开发、文化传承与经济发展,成为摆在管理者面前的重要课题。泰山管理部门坚持“保护为主、抢救第一、合理利用、加强管理”的方针,实施了一系列卓有成效的保护工程。岱庙天贶殿宋代壁画数字化保护项目,利用先进技术为千年国宝建立了完整的数字档案;泰山古建筑群修缮工程,严格遵循不改变文物原状的原则,恢复了古建筑的历史风貌;泰山封禅祭祀文化、泰山石敢当习俗、泰山庙会等非物质文化遗产项目,分别被列入国家级非物质文化遗产名录,得到了系统的保护与活态传承。同时,泰山景区积极推进智慧景区建设,通过预约限流、数字化导览、环境监测等手段,实现了遗产保护与游客满意度的双赢。 +2025年3月20日,春分时节,泰山迎来了今年的第100万名游客。这是一个具有象征意义的数据,它表明泰山作为“天下第一山”的永恒魅力。来自五湖四海的游客,或虔诚朝拜,或慕名探访,或挑战自我,每个人都以自己的方式与这座神山对话。清晨五点,日观峰上已站满了等待日出的年轻人;夕阳西下,天街上的游客依然流连忘返。来自广东的大学生小林,背着帐篷徒步登上泰山,他说:“登泰山就像阅读一部浓缩的中国史,每一步都在与古人对话。”年过七旬的退休教师王先生,已第十次登上泰山,他在大观峰前久久伫立:“每次来泰山,都有新的感悟。泰山不老,它永远年轻。”这些普通人的话语,道出了泰山跨越千年依然鲜活的生命力。 +站在玉皇顶,极目四望,云海苍茫,群山俯首。这一刻,你能够真切地理解,为什么泰山能够成为五岳独尊,为什么它被称为中华民族的精神家园。泰山的伟大,不在于它的绝对高度,而在于它与中华文明相伴相生的五千年历程,在于它所承载的历史记忆与民族情感,在于它所昭示的自强不息、厚德载物的文化精神。泰山是一座山,但泰山又不仅仅是一座山。它是大地隆起的史册,是文明镌刻的丰碑,是每一个中国人心中永恒的精神坐标。 +从远古洪荒到人工智能时代,从秦皇汉武到新时代青年,泰山始终以沉静的目光注视着华夏大地的沧桑巨变。它的岩石记录着地球童年的记忆,它的石刻承载着先贤哲思的光芒,它的松涛传唱着千古不朽的诗篇。泰山安,四海皆安。这朴素的话语中,蕴含着中国人对天下太平、国泰民安最深切的期盼与最坚定的信念。当我们登上泰山,实际上是在攀登一座精神的阶梯,是在进行一场穿越时空的文化寻根。泰山就在那里,沉稳、厚重、亘古不变,一如中华民族生生不息的文化血脉,一如东方文明历久弥新的智慧光芒。 +泰山如坐,静观天下风云;泰山如鼎,承载民族精神。这便是岱宗,这便是泰山。 diff --git a/examples/jiuge.py b/examples/jiuge.py index 2acc7fb3..901f0f77 100644 --- a/examples/jiuge.py +++ b/examples/jiuge.py @@ -131,6 +131,11 @@ def get_args(): default=1.0, help="sampling temperature", ) + parser.add_argument( + "--warmup", + action="store_true", + help="Perform a warmup run before benchmarking/inference." + ) return parser.parse_args() @@ -236,6 +241,44 @@ def test( model.reset_cache(cache_config) + # ---------------------------------------------------------------------------- # + # Warmup + # ---------------------------------------------------------------------------- # + if args.warmup: + warmup_steps = 1 + + # Choose a length that approximates the real workload. + # It should be long enough to trigger the correct kernel paths, + # but not so long that warmup becomes unnecessarily expensive. + avg_prompt_len = min(64, max(len(ids) for ids in input_ids_list)) + + # Use truncated versions of real prompts for warmup + warmup_ids = [ + ids[:avg_prompt_len] if len(ids) >= avg_prompt_len else ids + for ids in input_ids_list + ] + + input_ids_infini = infinicore.from_list(warmup_ids) + + print("=================== warmup start ===================") + + for _ in range(warmup_steps): + _ = model.generate( + input_ids_infini, + GenerationConfig( + max_new_tokens=2, # warmup decode kernel + temperature=temperature, + top_k=top_k, + top_p=top_p, + ), + _measure_and_log_time=False, + ) + + print("=================== warmup done ====================") + + # Reset KV cache + model.reset_cache(cache_config) + # ---------------------------------------------------------------------------- # # Generate # ---------------------------------------------------------------------------- # diff --git a/python/infinilm/server/inference_server.py b/python/infinilm/server/inference_server.py index a6197dfe..c45ac34f 100644 --- a/python/infinilm/server/inference_server.py +++ b/python/infinilm/server/inference_server.py @@ -594,6 +594,7 @@ def parse_args(): parser.add_argument("--iluvatar", action="store_true", help="Use Iluvatar device") parser.add_argument("--cambricon", action="store_true", help="Use Cambricon device") parser.add_argument("--ali", action="store_true", help="Use Ali PPU device") + parser.add_argument("--hygon", action="store_true", help="Use Hygon DCU device") parser.add_argument( "--enable-graph", action="store_true", @@ -631,9 +632,11 @@ def main(): device = "mlu" elif args.ali: device = "cuda" + elif args.hygon: + device = "cuda" else: print( - "Usage: python infinilm.server.inference_server [--cpu | --nvidia | --qy | --metax | --moore | --iluvatar | --cambricon | --ali] " + "Usage: python infinilm.server.inference_server [--cpu | --nvidia | --qy | --metax | --moore | --iluvatar | --cambricon | --ali | --hygon] " "--model_path= --max_tokens=MAX_TOKENS --max_batch_size=MAX_BATCH_SIZE" "\n" "Example: python infinilm.server.inference_server --nvidia --model_path=/data/shared/models/9G7B_MHA/ " diff --git a/test/bench/test_benchmark.py b/test/bench/test_benchmark.py index 95653366..2b01e8d0 100644 --- a/test/bench/test_benchmark.py +++ b/test/bench/test_benchmark.py @@ -73,6 +73,7 @@ def __init__( "iluvatar": "cuda", "kunlun": "cuda", "hygon": "cuda", + "ali": "cuda", } device_name = device_map.get(device_type_str.lower(), "cpu") @@ -184,11 +185,17 @@ def _generate_step(self, tokens, max_steps, topp_, topk_, temperature_): start_time = time.perf_counter() # For cpp backend, reset cache before generation if use_cache is enabled - if self.model.use_cache and hasattr(self.model, "_model") and hasattr(self.model._model, "reset_cache"): + if ( + self.model.use_cache + and hasattr(self.model, "_model") + and hasattr(self.model._model, "reset_cache") + ): batch_size = input_ids.shape[0] seq_len = input_ids.shape[1] max_cache_len = max_steps + seq_len - self.model.reset_cache(batch_size=batch_size, initial_capacity=max_cache_len) + self.model.reset_cache( + batch_size=batch_size, initial_capacity=max_cache_len + ) # Use model's built-in generate() method which properly handles KV cache # Pass sampling parameters (temperature, topk, topp) via kwargs @@ -656,7 +663,7 @@ def test(): # Parse arguments manually to handle device flags properly if len(sys.argv) < 4: print( - "Usage: python test_benchmark.py [--cpu | --nvidia| --cambricon | --ascend | --metax | --moore | --iluvatar | --kunlun | --hygon] --bench [ceval|mmlu] [--backend cpp|torch] [--ndev N] [--subject SUBJECT] [--split {test|val|all}] [--num_samples N] [--max_new_tokens N] [--output_csv PATH] [--cache_dir PATH]" + "Usage: python test_benchmark.py [--cpu | --nvidia| --cambricon | --ascend | --metax | --moore | --iluvatar | --kunlun | --hygon | --ali] --bench [ceval|mmlu] [--backend cpp|torch] [--ndev N] [--subject SUBJECT] [--split {test|val|all}] [--num_samples N] [--max_new_tokens N] [--output_csv PATH] [--cache_dir PATH]" ) sys.exit(1) @@ -739,9 +746,11 @@ def test(): device_type_str = "kunlun" elif device_flag == "--hygon": device_type_str = "hygon" + elif device_flag == "--ali": + device_type_str = "ali" else: print( - "Usage: python test_benchmark.py [--cpu | --nvidia| --cambricon | --ascend | --metax | --moore | --iluvatar | --kunlun | --hygon] --bench [ceval|mmlu] [--backend cpp|torch] [--ndev N] [--subject SUBJECT] [--num_samples N] [--max_new_tokens N] [--output_csv PATH] [--cache_dir PATH]" + "Usage: python test_benchmark.py [--cpu | --nvidia| --cambricon | --ascend | --metax | --moore | --iluvatar | --kunlun | --hygon | --ali] --bench [ceval|mmlu] [--backend cpp|torch] [--ndev N] [--subject SUBJECT] [--num_samples N] [--max_new_tokens N] [--output_csv PATH] [--cache_dir PATH]" ) sys.exit(1) @@ -935,9 +944,7 @@ def _load_mmlu_subject(subj): splits_to_load = ( ["test"] if split == "test" - else ["validation"] - if split == "val" - else ["validation", "test"] + else ["validation"] if split == "val" else ["validation", "test"] ) # Load each subject individually from hardcoded list, excluding "all" for subject_name in mmlu_subjects: @@ -959,9 +966,7 @@ def _load_mmlu_subject(subj): splits_to_load = ( ["test"] if split == "test" - else ["validation"] - if split == "val" - else ["validation", "test"] + else ["validation"] if split == "val" else ["validation", "test"] ) records = [] for sp in splits_to_load: diff --git a/xmake.lua b/xmake.lua index aab1a0c7..739fe913 100644 --- a/xmake.lua +++ b/xmake.lua @@ -8,6 +8,16 @@ set_toolchains("gcc") add_includedirs("third_party/spdlog/include") add_includedirs("third_party/json/single_include/") +option("ninetoothed") + set_default(false) + set_showmenu(true) + set_description("Whether to complie NineToothed specifc path") +option_end() + +if has_config("ninetoothed") then + add_defines("ENABLE_NINETOOTHED") +end + target("infinicore_infer") set_kind("shared")