<cite id="ffb66"></cite><cite id="ffb66"><track id="ffb66"></track></cite>
      <legend id="ffb66"><li id="ffb66"></li></legend>
      色婷婷久,激情色播,久久久无码专区,亚洲中文字幕av,国产成人A片,av无码免费,精品久久国产,99视频精品3
      網(wǎng)易首頁(yè) > 網(wǎng)易號(hào) > 正文 申請(qǐng)入駐

      純國(guó)產(chǎn)、輕量級(jí)大模型訓(xùn)練框架,來自阿里魔搭

      0
      分享至

      今天來聊一個(gè)我覺得挺有意思的新項(xiàng)目——魔搭(ModelScope)團(tuán)隊(duì)剛開源的Twinkle?,一個(gè)讓大模型訓(xùn)練真正"亮起來"的訓(xùn)練框架。

      順帶說一句,這篇文章介紹的項(xiàng)目也是來自魔搭

      簡(jiǎn)介

      做過模型訓(xùn)練的同學(xué)應(yīng)該都深有體會(huì):訓(xùn)練一個(gè)大模型,最痛苦的不是算法本身,而是搞基礎(chǔ)設(shè)施。你寫好了訓(xùn)練代碼,結(jié)果要在分布式環(huán)境下跑起來,先是配 Ray 集群,再是搞數(shù)據(jù)并行、模型并行,checkpoint 又要同步……光是把這套流水線跑通就夠花上好幾天時(shí)間了。

      Twinkle? 想解決的就是這個(gè)問題。一句話總結(jié):它是一個(gè)輕量級(jí)的客戶端-服務(wù)端訓(xùn)練框架,把訓(xùn)練邏輯封裝成標(biāo)準(zhǔn)化 API,不管你用 torchrun 本地跑還是用 Ray 集群跑,代碼基本不用改。

      更牛的是,它還能作為Training-as-a-Service(TaaS)的后端網(wǎng)關(guān)——也就是說,你甚至可以像調(diào) API 一樣訓(xùn)練模型。這在企業(yè)級(jí)場(chǎng)景下簡(jiǎn)直太香了。

      下面這張架構(gòu)圖一目了然:


      Twinkle 架構(gòu)設(shè)計(jì):解耦的客戶端-服務(wù)端架構(gòu)

      核心亮點(diǎn)拉出來說:

      • 解耦架構(gòu):客戶端和服務(wù)端分離,標(biāo)準(zhǔn)化接口設(shè)計(jì),向后兼容 Tinker API。搞過 Tinker 的同學(xué)遷移成本極低,改個(gè) base URL 就行

      • 三種運(yùn)行模式:torchrun / Ray / HTTP,本地調(diào)試、集群訓(xùn)練、遠(yuǎn)程 API 服務(wù)隨便切換

      • 多后端支持:同時(shí)支持 Transformers 和 Megatron 后端,Dense 模型和 MoE 模型都能搞

      • 多租戶訓(xùn)練:在同一個(gè)基礎(chǔ)模型上同時(shí)跑多個(gè) LoRA 訓(xùn)練任務(wù),互不干擾——這個(gè)功能是真的硬核

      另外值得一提的是,Twinkle? 是ms-swift(魔搭之前非常知名的訓(xùn)練框架)團(tuán)隊(duì)打造的。官方也明確說了,預(yù)計(jì) Twinkle 中的一些基礎(chǔ)組件會(huì)被 ms-swift 復(fù)用,可以說這兩個(gè)項(xiàng)目是共同演進(jìn)的關(guān)系。

      多租戶:一個(gè)底座跑 N 個(gè)訓(xùn)練任務(wù)

      這應(yīng)該是 Twinkle 最讓人眼前一亮的功能了。

      想象一下這個(gè)場(chǎng)景:公司有一臺(tái) A100 集群,同時(shí)有 4 個(gè)團(tuán)隊(duì)要微調(diào)模型。傳統(tǒng)做法是排隊(duì),一個(gè)一個(gè)來。但用了 Twinkle 的多租戶架構(gòu),4 個(gè)團(tuán)隊(duì)可以同時(shí)在一個(gè)底座模型上訓(xùn)練各自的 LoRA,完全隔離。


      多租戶訓(xùn)練架構(gòu):LoRA 池 + 租戶隔離

      舉個(gè)真實(shí)例子:

      • 租戶 A:加載本地私有數(shù)據(jù)集,LoRA rank=8,用基礎(chǔ)模型做 SFT

      • 租戶 B:從 Hub 拉開源數(shù)據(jù)集,LoRA rank=32,跑預(yù)訓(xùn)練

      • 租戶 C:用基礎(chǔ)模型做 GRPO 損失計(jì)算,搞強(qiáng)化學(xué)習(xí)

      • 租戶 D:純推理,算 logps

      這 4 個(gè)任務(wù)并發(fā)跑在同一個(gè)底座模型上,因?yàn)?Twinkle 把模型和采樣器設(shè)計(jì)成了「任務(wù)無關(guān)組件」。訓(xùn)練完成后,checkpoint 還能自動(dòng)推送到 ModelScope 或 HuggingFace 的倉(cāng)庫(kù)(默認(rèn)私有)。

      說白了,這就是給企業(yè)場(chǎng)景準(zhǔn)備的「GPU 多人共享訓(xùn)練平臺(tái)」。在 GPU 資源緊張的今天,這種設(shè)計(jì)真的太實(shí)用了。

      注意:目前多租戶的并發(fā)訓(xùn)練主要針對(duì) LoRA 優(yōu)化。當(dāng)然作為模塊化框架,Twinkle 也支持遠(yuǎn)程臨時(shí)獨(dú)占訓(xùn)練,也就是全參數(shù)訓(xùn)練模式。
      支持的模型

      Twinkle 目前支持的模型覆蓋面已經(jīng)相當(dāng)廣了,主流的大模型基本都有:

      模型系列

      代表模型

      參數(shù)規(guī)模

      Megatron 支持

      Qwen3 全系列

      Qwen3-14B-Base

      0.6B ~ 32B

      Qwen3 MoE

      Qwen3-30B-A3B

      30B-A3B, 235B-A22B

      Qwen3.5 MoE

      Qwen3.5-35B-A3B

      35B-A3B, 122B-A10B

      Qwen3.5 Dense

      Qwen3.5-9B

      2B ~ 27B

      Qwen2 / 2.5 全系列

      Qwen2.5-1.5B-Instruct

      0.5B ~ 72B

      ChatGLM3/4

      glm-4-9b-chat

      6B ~ 9B

      InternLM2

      internlm2-1_8b

      1.8B ~ 7B

      DeepSeek V2

      DeepSeek-V2-Lite

      V2 全系列

      DeepSeek R1

      DeepSeek-R1

      DeepSeek R1 蒸餾版

      R1-Distill-Qwen-7B

      1.5B ~ 32B

      可以看到,Qwen 系列和 DeepSeek 系列的 Megatron 支持做得最好。GLM 和 InternLM 暫時(shí)只支持 Transformers 后端。

      而且官方也說了,隨著新模型的發(fā)布會(huì)持續(xù)添加支持。目前在 ModelScope 上提供的 Serverless 訓(xùn)練服務(wù),底座模型用的是Qwen3-30B-A3B-Instruct-2507

      安裝

      安裝非常簡(jiǎn)單,一行 pip 搞定:

      pip install 'twinkle-kit'

      如果需要從源碼安裝:

      git clone https://github.com/modelscope/twinkle.git
      cd twinkle
      pip install -e .

      環(huán)境要求:Python >= 3.11,PyTorch >= 2.0。

      如果要用 Megatron 后端,還需要額外安裝 Megatron-LM(倉(cāng)庫(kù)里有INSTALL_MEGATRON.sh腳本可以直接用)。

      使用

      來看一個(gè)用 Ray 訓(xùn)練 LoRA 的完整示例。代碼整體寫起來非常清晰:

      from peft import LoraConfig
      import twinkle
      from twinkle import DeviceMesh, DeviceGroup
      from twinkle.dataloader import DataLoader
      from twinkle.dataset import Dataset, DatasetMeta
      from twinkle.model import TransformersModel
      from twinkle.preprocessor import SelfCognitionProcessor

      # 定義設(shè)備組和 mesh
      device_group = [DeviceGroup(name='default', ranks=8, device_type='cuda')]
      device_mesh = DeviceMesh.from_sizes(fsdp_size=4, dp_size=2)
      twinkle.initialize(mode='ray', groups=device_group, global_device_mesh=device_mesh)

      def train():
      # 從 ModelScope 加載模型(HuggingFace 用 'hf://...')
      base_model = 'ms://Qwen/Qwen3.5-4B'
      # 加載 1000 條樣本
      dataset = Dataset(dataset_meta=DatasetMeta(
      'ms://swift/self-cognition', data_slice=range(1000)
      ))
      dataset.set_template('Template', model_id=base_model)
      dataset.map(SelfCognitionProcessor('twinkle LLM', 'ModelScope Community'))
      dataset.encode()
      # 全局 batch size = 8
      dataloader = DataLoader(dataset=dataset, batch_size=8, min_batch_size=8)
      # 使用 Transformers 后端
      model = TransformersModel(model_id=base_model, remote_group='default')
      # 配置 LoRA
      lora_config = LoraConfig(r=8, lora_alpha=32, target_modules='all-linear')
      model.add_adapter_to_model('default', lora_config, gradient_accumulation_steps=2)
      model.set_optimizer(optimizer_cls='AdamW', lr=1e-4)
      model.set_lr_scheduler(
      scheduler_cls='CosineWarmupScheduler',
      num_warmup_steps=5,
      num_training_steps=len(dataloader)
      )
      # 訓(xùn)練循環(huán)
      for step, batch in enumerate(dataloader):
      model.forward_backward(inputs=batch)
      model.clip_grad_and_step()
      if step % 20 == 0:
      metric = model.calculate_metric(is_training=True)
      print(f'Step {step}/{len(dataloader)}, metric: {metric}')
      model.save('last-checkpoint')

      if __name__ == '__main__':
      train()

      說實(shí)話,看完這段代碼我是挺驚喜的。整個(gè) API 設(shè)計(jì)得非常 Pythonic:加載數(shù)據(jù)、設(shè)置模板、定義模型、配置 LoRA、訓(xùn)練循環(huán),每一步都很直觀。特別是ms://hf://的前綴設(shè)計(jì),可以無縫切換 ModelScope 和 HuggingFace 的模型源,很優(yōu)雅。

      訓(xùn)練即服務(wù)(TaaS)

      Twinkle 還有一個(gè)殺手級(jí)的功能:在 ModelScope 上提供了 Serverless 訓(xùn)練服務(wù),目前處于 Beta 階段。

      怎么用呢?加入 Twinkle-Explorers 組織就能免費(fèi)體驗(yàn)。用 Tinker 兼容 API 調(diào)用就行:

      from tinker import ServiceClient, types
      from twinkle import init_tinker_client

      base_url = 'https://www.modelscope.cn/twinkle'
      api_key = 'your-api-key'

      init_tinker_client()
      service_client = ServiceClient(base_url=base_url, api_key=api_key)
      training_client = service_client.create_lora_training_client(
      base_model='Qwen/Qwen3-30B-A3B-Instruct-2507', rank=16
      )

      # 像調(diào) API 一樣訓(xùn)練模型
      for epoch in range(3):
      for step, batch in enumerate(dataloader):
      input_datum = [input_feature_to_datum(feat) for feat in batch]
      fwdbwd_future = training_client.forward_backward(input_datum, "cross_entropy")
      optim_future = training_client.optim_step(types.AdamParams(learning_rate=1e-4))
      fwdbwd_future.result()
      optim_future.result()
      training_client.save_state(f"twinkle-lora-{epoch}").result()

      沒有 GPU?沒關(guān)系,用 ModelScope 的 Serverless 訓(xùn)練服務(wù),遠(yuǎn)程調(diào) API 就能訓(xùn)練一個(gè) 30B 的 MoE 模型的 LoRA。對(duì)于個(gè)人開發(fā)者和小團(tuán)隊(duì)來說,這簡(jiǎn)直是福音。

      模塊化生態(tài)

      Twinkle 的模塊化設(shè)計(jì)做得相當(dāng)細(xì)致,一共有 20 個(gè)標(biāo)準(zhǔn)模塊:

      類別

      模塊

      功能

      數(shù)據(jù)層

      Dataset / Template / DataLoader / Preprocessor / InputProcessor

      數(shù)據(jù)加載、編解碼、分發(fā)、ETL、任務(wù)處理

      模型層

      Model / Sampler / Loss / Metric / Reward / Advantage

      大模型、采樣、損失、指標(biāo)、獎(jiǎng)勵(lì)、優(yōu)勢(shì)函數(shù)

      工程層

      CheckpointEngine / Patch / Module / Kernel

      權(quán)重同步、模型修復(fù)、組件、算子

      服務(wù)層

      Server / Client / Infra / Plugin / Hub

      集群?jiǎn)?dòng)、客戶端、基礎(chǔ)設(shè)施抽象、插件、Hub 對(duì)接

      每個(gè)模塊都是高內(nèi)聚的,可以單獨(dú)替換或擴(kuò)展。比如你想換個(gè)自定義的損失函數(shù)?實(shí)現(xiàn) Loss 接口就行。想用自己的采樣策略?實(shí)現(xiàn) Sampler 接口即可。這種設(shè)計(jì)讓框架的可擴(kuò)展性非常強(qiáng)。

      社區(qū)也已經(jīng)開始貢獻(xiàn)組件了,比如 ModelScope 官方提供了一個(gè)qwen3_moe_transformers4_patch,專門修復(fù) Qwen3 MoE 模型在 FSDP2 訓(xùn)練時(shí)掛起的問題。

      豐富的 Cookbook

      Twinkle 提供了覆蓋多個(gè)場(chǎng)景的訓(xùn)練腳本:

      訓(xùn)練類型

      后端

      FSDP 微調(diào)

      Transformers

      全參數(shù)微調(diào)

      FSDP MoE 微調(diào)

      Transformers

      MoE 架構(gòu)專用

      Expert Parallelism + FSDP

      Transformers

      專家并行 + 數(shù)據(jù)并行

      Sequence Parallelism + FSDP

      Transformers

      序列并行,超長(zhǎng)上下文訓(xùn)練

      TP 訓(xùn)練

      Megatron

      張量并行

      TP MoE 訓(xùn)練

      Megatron

      MoE + 張量并行

      Tinker/Twinkle 客戶端訓(xùn)練

      兩者均支持

      遠(yuǎn)程 API 方式訓(xùn)練

      這個(gè)覆蓋面已經(jīng)很全了。無論你是用 Transformers 還是 Megatron 后端,Dense 還是 MoE 模型,本地還是遠(yuǎn)程訓(xùn)練,基本都有現(xiàn)成的 cookbook 可以參考。

      總結(jié)

      Twinkle? 是我最近看到的最有想象力的大模型訓(xùn)練框架之一。

      它不只是又一個(gè)訓(xùn)練工具,而是把"訓(xùn)練即服務(wù)"這個(gè)概念真正落地了。客戶端-服務(wù)端解耦、多租戶 LoRA 并行訓(xùn)練、Serverless TaaS、多后端支持……每一個(gè)特性單拿出來都有競(jìng)爭(zhēng)力,組合在一起就是一套完整的企業(yè)級(jí)訓(xùn)練解決方案。

      優(yōu)點(diǎn):

      • 架構(gòu)設(shè)計(jì)優(yōu)雅,模塊化程度高,擴(kuò)展性強(qiáng)

      • 多租戶 LoRA 并行訓(xùn)練是真正的差異化賣點(diǎn)

      • 支持 Transformers / Megatron 雙后端

      • ModelScope TaaS 服務(wù)讓沒有 GPU 的開發(fā)者也能訓(xùn)練大模型

      • 和 ms-swift 生態(tài)互通,組件可復(fù)用

      • 代碼風(fēng)格清晰,API 設(shè)計(jì)很 Pythonic

      需要注意的地方:

      • 項(xiàng)目剛開源不久(2026 年 2 月首版),生態(tài)還在建設(shè)中

      • 多租戶并發(fā)目前僅針對(duì) LoRA 優(yōu)化

      • 支持的模型雖然覆蓋主流,但不如 ms-swift 那么全

      • 對(duì)華為昇騰 NPU 的支持還在完善中(文檔已經(jīng)有 NPU 開箱指南了)

      如果你是做大模型訓(xùn)練的企業(yè)用戶,特別是需要多人共享 GPU 集群訓(xùn)練各自模型的場(chǎng)景,Twinkle 值得重點(diǎn)關(guān)注。如果你是個(gè)人開發(fā)者,可以先體驗(yàn)一下 ModelScope 上的免費(fèi) Serverless 訓(xùn)練服務(wù),感受一下"API 訓(xùn)練大模型"的快感。

      官方鏈接:

      • GitHub:https://github.com/modelscope/twinkle

      • 中文文檔:https://twinkle-kit.readthedocs.io/zh-cn/latest/

      • PyPI:https://pypi.org/project/twinkle-kit/

      • Serverless 訓(xùn)練服務(wù):加入 Twinkle-Explorers 組織即可體驗(yàn)

      制作不易,如果這篇文章覺得對(duì)你有用,可否點(diǎn)個(gè)關(guān)注。給我個(gè)三連擊:點(diǎn)贊、轉(zhuǎn)發(fā)和在看。若可以再給我加個(gè),謝謝你看我的文章,我們下篇再見!

      特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。

      Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

      相關(guān)推薦
      熱點(diǎn)推薦
      4月20日人民幣對(duì)美元中間價(jià)調(diào)貶26個(gè)基點(diǎn)

      4月20日人民幣對(duì)美元中間價(jià)調(diào)貶26個(gè)基點(diǎn)

      證券時(shí)報(bào)
      2026-04-20 09:33:02
      趕回家見病危兒子最后一面 62歲大叔在火車上泣不成聲! 同車男子買來盒飯默默安慰

      趕回家見病危兒子最后一面 62歲大叔在火車上泣不成聲! 同車男子買來盒飯默默安慰

      閃電新聞
      2026-04-20 13:11:13
      恒大暴雷之前,許家印為什么沒有跑?

      恒大暴雷之前,許家印為什么沒有跑?

      擔(dān)撲
      2026-04-19 13:40:25
      恩德里克:我一直對(duì)曼聯(lián)很有好感,因?yàn)镃羅曾在那里踢球

      恩德里克:我一直對(duì)曼聯(lián)很有好感,因?yàn)镃羅曾在那里踢球

      懂球帝
      2026-04-20 11:31:03
      舒淇不再隱瞞!多年無子的她終于承認(rèn):我們不是丁克,是生不出來

      舒淇不再隱瞞!多年無子的她終于承認(rèn):我們不是丁克,是生不出來

      長(zhǎng)歌侃娛
      2026-04-19 09:54:43
      瓜迪奧拉:我要哭了!哈蘭德:他TM就是卡納瓦羅!

      瓜迪奧拉:我要哭了!哈蘭德:他TM就是卡納瓦羅!

      硯底沉香
      2026-04-20 09:03:22
      你做初一,我做十五!日艦過航臺(tái)海三天后,052D沖向橫當(dāng)水道

      你做初一,我做十五!日艦過航臺(tái)海三天后,052D沖向橫當(dāng)水道

      烈史
      2026-04-20 12:04:36
      貴州一地突降冰雹最厚處30厘米,當(dāng)?shù)厥褂苗P車清理,部分農(nóng)作物受損,鄉(xiāng)政府:正統(tǒng)計(jì)受災(zāi)情況

      貴州一地突降冰雹最厚處30厘米,當(dāng)?shù)厥褂苗P車清理,部分農(nóng)作物受損,鄉(xiāng)政府:正統(tǒng)計(jì)受災(zāi)情況

      極目新聞
      2026-04-20 11:15:09
      CBA最新消息!上海男籃大將常規(guī)賽報(bào)銷,北京首鋼簽約頂級(jí)后衛(wèi)

      CBA最新消息!上海男籃大將常規(guī)賽報(bào)銷,北京首鋼簽約頂級(jí)后衛(wèi)

      金風(fēng)說
      2026-04-20 13:19:23
      重磅!美媒稱哈登就是NBA從未奪冠的最偉大球員,沒有之一

      重磅!美媒稱哈登就是NBA從未奪冠的最偉大球員,沒有之一

      銜春信
      2026-04-20 08:04:19
      悲劇!廣東96年女生開會(huì)時(shí)心梗猝死 為2萬月薪半年熬夜硬扛

      悲劇!廣東96年女生開會(huì)時(shí)心梗猝死 為2萬月薪半年熬夜硬扛

      老貓觀點(diǎn)
      2026-04-20 06:01:26
      比失業(yè)更可怕的是工資倒退,深圳的工資已經(jīng)降到了10年前

      比失業(yè)更可怕的是工資倒退,深圳的工資已經(jīng)降到了10年前

      細(xì)說職場(chǎng)
      2026-04-07 11:32:47
      碾壓珠穆朗瑪峰!火星上的山為何能長(zhǎng)到2萬米?重力不是唯一原因

      碾壓珠穆朗瑪峰!火星上的山為何能長(zhǎng)到2萬米?重力不是唯一原因

      半解智士
      2026-04-18 18:44:07
      丈夫駐邊20年不回家,我?guī)е⒆忧Ю锾接H,部隊(duì):他壓根沒入伍

      丈夫駐邊20年不回家,我?guī)е⒆忧Ю锾接H,部隊(duì):他壓根沒入伍

      紅豆講堂
      2025-10-14 16:22:44
      穆里尼奧神換人:替補(bǔ)神兵補(bǔ)時(shí)絕殺,30輪不敗,升到聯(lián)賽第2名

      穆里尼奧神換人:替補(bǔ)神兵補(bǔ)時(shí)絕殺,30輪不敗,升到聯(lián)賽第2名

      足球狗說
      2026-04-20 07:28:31
      央視離職者傳十年換五任妻子,私生活現(xiàn)狀引關(guān)注

      央視離職者傳十年換五任妻子,私生活現(xiàn)狀引關(guān)注

      暖心萌阿菇?jīng)?/span>
      2026-04-19 13:19:26
      57歲歌手陳紅近況曝光!離婚后被前夫拿走12億,兒子成為她的驕傲

      57歲歌手陳紅近況曝光!離婚后被前夫拿走12億,兒子成為她的驕傲

      代軍哥哥談娛樂
      2026-04-18 09:57:07
      特朗普下令開火攔船:美軍擊穿伊朗貨船機(jī)艙,直接登船接管

      特朗普下令開火攔船:美軍擊穿伊朗貨船機(jī)艙,直接登船接管

      桂系007
      2026-04-20 05:10:26
      路易十六哀歌:善良是大革命的最大原罪

      路易十六哀歌:善良是大革命的最大原罪

      朝廷心腹
      2026-04-16 14:20:31
      不再為美兜底!中國(guó)拒絕美8500億債務(wù),救美國(guó)就是救中國(guó)時(shí)代落幕

      不再為美兜底!中國(guó)拒絕美8500億債務(wù),救美國(guó)就是救中國(guó)時(shí)代落幕

      阿器談史
      2026-04-18 11:27:57
      2026-04-20 14:35:00
      Ai學(xué)習(xí)的老章 incentive-icons
      Ai學(xué)習(xí)的老章
      Ai學(xué)習(xí)的老章
      3335文章數(shù) 11137關(guān)注度
      往期回顧 全部

      科技要聞

      藍(lán)色起源一級(jí)火箭完美回收 客戶衛(wèi)星未入軌

      頭條要聞

      媒體:伊朗剛說不談 美國(guó)立即開打

      頭條要聞

      媒體:伊朗剛說不談 美國(guó)立即開打

      體育要聞

      七大獎(jiǎng)項(xiàng)候選官宣!文班或全票DPOY

      娛樂要聞

      鹿晗生日上熱搜,被關(guān)曉彤撕下體面

      財(cái)經(jīng)要聞

      月之暗面IPO迷局

      汽車要聞

      把天門山搬進(jìn)廠?開仰望U8沖上45度坡的那刻 我腿軟了

      態(tài)度原創(chuàng)

      藝術(shù)
      時(shí)尚
      旅游
      家居
      手機(jī)

      藝術(shù)要聞

      王羲之《換鵝帖》尚在人間,驚艷無比!

      今年最流行的衣服竟然是它?高級(jí)又氣質(zhì)!

      旅游要聞

      800年紫藤花開如瀑 最美寧陽(yáng)四月天

      家居要聞

      自然慢調(diào) 慢享時(shí)光

      手機(jī)要聞

      蘋果iOS 27曝光:主屏幕編輯菜單新增“撤銷”與“重做”按鈕

      無障礙瀏覽 進(jìn)入關(guān)懷版