llmcompressor.pipelines.sequential.ast_utils
模块
类
-
AutoWrapper–根据以下模式自动包装不可追踪的代码
-
ControlFlowAnalyzer–用于确定一段代码是否可以被包装成函数。包括任何
-
NameAnalyzer–确定与代码片段关联的未绑定、已分配和条件分配的名称
AutoWrapper
基类:NodeTransformer
根据以下模式自动包装不可追踪的代码
以下模式会自动包装 1. 条件无法静态评估的 If 语句 2. 被忽略的函数 (_update_causal_mask) 3. 星号元组解包 4. 星号参数解包
另请参阅:https://github.com/vllm-project/llm-compressor/pull/1411
方法
-
auto_wrap–通过自动包装任何不可追踪的代码段来修改 ast。要包装的段落通过代码分析和基本模式匹配来确定
-
visit_Call–包装使用 (4) 可变参数或 (2) 匹配忽略列表的任何函数
-
visit_Delete–从
self._local_names中移除任何已删除的名称, -
visit_FunctionDef–移除阻止函数前向重新编译的装饰器
-
visit_If–尝试静态评估
if语句的条件。如果 -
visit_Name–添加
self._local_names中的任何新名称, -
visit_Tuple–(3) 包装任何使用星号解包的元组
源代码位于 llmcompressor/pipelines/sequential/ast_utils/auto_wrapper.py
auto_wrap
通过自动包装任何不可追踪的代码段来修改 ast。要包装的代码段通过代码分析和基本模式匹配来确定
参数
-
(treeModule) –包含原始前向函数定义的模块
返回
-
Module–包含包装函数定义和函数调用的模块
源代码位于 llmcompressor/pipelines/sequential/ast_utils/auto_wrapper.py
visit_Call
包装使用 (4) 可变参数或 (2) 匹配忽略列表的任何函数
源代码位于 llmcompressor/pipelines/sequential/ast_utils/auto_wrapper.py
visit_Delete
从 self._local_names 中移除任何已删除的名称,这些名称用于确定函数包装器的参数
源代码位于 llmcompressor/pipelines/sequential/ast_utils/auto_wrapper.py
visit_FunctionDef
移除阻止函数前向重新编译的装饰器 例如,add_start_docstrings_to_model_forward
由于 _wrapper_fn_defs 在 visit 完成后追加,因此此函数不会影响包装函数
参数
-
(节点FunctionDef) –将被剥离装饰器的函数定义
返回
-
FunctionDef–没有装饰器的函数定义
源代码位于 llmcompressor/pipelines/sequential/ast_utils/auto_wrapper.py
visit_If
尝试静态评估 if 语句的条件。如果条件无法静态评估 (1),则尝试包装 if 语句
参数
-
(节点If) –可能被包装的
if语句
返回
-
Union[If, Assign]–如果
if语句无法静态评估,则返回if语句,并将条件替换为True或False。否则,返回一个包装函数调用
源代码位于 llmcompressor/pipelines/sequential/ast_utils/auto_wrapper.py
visit_Name
添加 self._local_names 中的任何新名称,这些名称用于确定函数包装器的参数
源代码位于 llmcompressor/pipelines/sequential/ast_utils/auto_wrapper.py
visit_Tuple
(3) 包装任何使用星号解包的元组
源代码位于 llmcompressor/pipelines/sequential/ast_utils/auto_wrapper.py
ControlFlowAnalyzer
基类:NodeVisitor
用于确定一段代码是否可以被包装成函数。包括任何包含 return、continue、break、await 或 yield 而没有适当上下文的代码。
例如,这段代码可以被包装
而内部代码在没有 while 上下文的情况下无法被包装
def wrapped():
if some_condition:
break # this control statement is now invalid
while True:
wrapped()
方法
-
is_valid–如果节点包含不在其
is_valid
如果节点包含不在其 proper 控制流上下文中的控制语句,则返回 False
参数
-
(节点AST) –要分析的代码
返回
-
bool–当代码不包含无效的控制语句时为 True
源代码位于 llmcompressor/pipelines/sequential/ast_utils/control_flow_analyzer.py
NameAnalyzer
基类:NodeVisitor
确定代码片段中未绑定、已分配和条件分配的名称。此信息用于确定包装函数的参数和返回值
例如,对于以下代码片段
a 未绑定,意味着它必须是包装函数的输入 b 已分配,意味着它必须是包装函数的输出 c 是条件分配的,意味着它必须是包装函数的输出,并且可能是输入,前提是 c 已经在命名空间中存在
请注意,在读取之前分配给的名称不被视为未绑定
方法
-
analyze–分析给定代码片段中名称的使用情况
源代码位于 llmcompressor/pipelines/sequential/ast_utils/name_analyzer.py
analyze
分析给定代码片段中名称的使用情况
参数
-
(节点AST) –要分析的代码 返回:未绑定名称、已分配名称和条件分配名称的元组