PyTorch torch.is_inference_mode_enabled 関数
torch.is_inference_mode_enabledは、PyTorch で現在推論モードが有効かどうかを確認するための関数です。現在の状態を返します。inference_modeコンテキストのブール値。
これは、推論モードの状態に応じて異なるロジックを実行する必要があるコードを書く場合に非常に便利です。
関数定義
torch.is_inference_mode_enabled()
パラメータ:
- パラメータなし。
戻り値:
- ブール値を返します。現在推論モードが有効な場合は、
True;そうでなければ返します。False。
使用例
例1: 基本的な使い方
実例
import torch
# デフォルトでは、推論モードは無効です
print("デフォルト状態:", torch.is_inference_mode_enabled())
# inference_mode コンテキスト内
with torch.inference_mode():
print("inference_mode 内:", torch.is_inference_mode_enabled())
# 終了後に復元
print("終了後:", torch.is_inference_mode_enabled())
# デフォルトでは、推論モードは無効です
print("デフォルト状態:", torch.is_inference_mode_enabled())
# inference_mode コンテキスト内
with torch.inference_mode():
print("inference_mode 内:", torch.is_inference_mode_enabled())
# 終了後に復元
print("終了後:", torch.is_inference_mode_enabled())
出力結果は次のとおりです。
默认状态: False 在 inference_mode 中: True 退出后: False
例2: is_grad_enabled と is_inference_mode_enabled の比較
実例
import torch
# no_grad 内
with torch.no_grad():
print("no_grad 内:")
print(" is_grad_enabled:", torch.is_grad_enabled())
print(" is_inference_mode_enabled:", torch.is_inference_mode_enabled())
# inference_mode 内
with torch.inference_mode():
print("inference_mode 内:")
print(" is_grad_enabled:", torch.is_grad_enabled())
print(" is_inference_mode_enabled:", torch.is_inference_mode_enabled())
# デフォルト状態
print("デフォルト状態:")
print(" is_grad_enabled:", torch.is_grad_enabled())
print(" is_inference_mode_enabled:", torch.is_inference_mode_enabled())
# no_grad 内
with torch.no_grad():
print("no_grad 内:")
print(" is_grad_enabled:", torch.is_grad_enabled())
print(" is_inference_mode_enabled:", torch.is_inference_mode_enabled())
# inference_mode 内
with torch.inference_mode():
print("inference_mode 内:")
print(" is_grad_enabled:", torch.is_grad_enabled())
print(" is_inference_mode_enabled:", torch.is_inference_mode_enabled())
# デフォルト状態
print("デフォルト状態:")
print(" is_grad_enabled:", torch.is_grad_enabled())
print(" is_inference_mode_enabled:", torch.is_inference_mode_enabled())
出力結果は次のとおりです。
在 no_grad 中: is_grad_enabled: False is_inference_mode_enabled: False 在 inference_mode 中: is_grad_enabled: False is_inference_mode_enabled: True 默认状态: is_grad_enabled: True is_inference_mode_enabled: False
例3: 条件分岐での使用
実例
import torch
import torch.nn as nn
def forward_pass(x, model):
"""推論モードに応じて異なる最適化を実行"""
if torch.is_inference_mode_enabled():
print("推論モードの最適化を使用")
# 推論モードでの最適化計算
return model(x)
elif torch.is_grad_enabled():
print("トレーニングモード")
return model(x)
else:
print("eval モード")
return model(x)
model = nn.Linear(10, 5)
x = torch.randn(5, 10)
# 異なる状態をテスト
print("=== トレーニングモード ===")
with torch.enable_grad():
result = forward_pass(x, model)
print("n=== 推論モード ===")
with torch.inference_mode():
result = forward_pass(x, model)
print("n=== eval モード ===")
with torch.no_grad():
result = forward_pass(x, model)
import torch.nn as nn
def forward_pass(x, model):
"""推論モードに応じて異なる最適化を実行"""
if torch.is_inference_mode_enabled():
print("推論モードの最適化を使用")
# 推論モードでの最適化計算
return model(x)
elif torch.is_grad_enabled():
print("トレーニングモード")
return model(x)
else:
print("eval モード")
return model(x)
model = nn.Linear(10, 5)
x = torch.randn(5, 10)
# 異なる状態をテスト
print("=== トレーニングモード ===")
with torch.enable_grad():
result = forward_pass(x, model)
print("n=== 推論モード ===")
with torch.inference_mode():
result = forward_pass(x, model)
print("n=== eval モード ===")
with torch.no_grad():
result = forward_pass(x, model)
出力結果は次のとおりです。
=== 训练模式 === 训练模式 === 推理模式 === 使用推理模式优化 === eval 模式 === eval 模式
例4: カスタムモジュールでの検出
実例
import torch
import torch.nn as nn
class OptimizedLayer(nn.Module):
def __init__(self):
super().__init__()
self.weight = nn.Parameter(torch.randn(20, 10))
def forward(self, x):
# 推論モードを検出して最適化を適用
if torch.is_inference_mode_enabled():
# 推論モード: より効率的な計算方法を使用
return torch.mm(x, self.weight)
elif torch.is_grad_enabled():
# トレーニングモード: 勾配計算を保持
return torch.mm(x, self.weight)
else:
# eval モード: 勾配は不要だが最適化は使用可能
with torch.no_grad():
return torch.mm(x, self.weight)
layer = OptimizedLayer()
x = torch.randn(5, 10)
print("=== トレーニングモード ===")
with torch.enable_grad():
_ = layer(x)
print("n=== 推論モード ===")
with torch.inference_mode():
_ = layer(x)
print("n=== eval モード ===")
with torch.no_grad():
_ = layer(x)
import torch.nn as nn
class OptimizedLayer(nn.Module):
def __init__(self):
super().__init__()
self.weight = nn.Parameter(torch.randn(20, 10))
def forward(self, x):
# 推論モードを検出して最適化を適用
if torch.is_inference_mode_enabled():
# 推論モード: より効率的な計算方法を使用
return torch.mm(x, self.weight)
elif torch.is_grad_enabled():
# トレーニングモード: 勾配計算を保持
return torch.mm(x, self.weight)
else:
# eval モード: 勾配は不要だが最適化は使用可能
with torch.no_grad():
return torch.mm(x, self.weight)
layer = OptimizedLayer()
x = torch.randn(5, 10)
print("=== トレーニングモード ===")
with torch.enable_grad():
_ = layer(x)
print("n=== 推論モード ===")
with torch.inference_mode():
_ = layer(x)
print("n=== eval モード ===")
with torch.no_grad():
_ = layer(x)
出力結果は次のとおりです。
=== 训练模式 === 训练模式 === 推理模式 === 推理模式:使用更高效的计算方式 === eval 模式 === eval 模式
関連関数
torch.inference_mode(): 推論モードを有効にするコンテキストマネージャー。torch.no_grad(): 勾配計算を無効にするコンテキストマネージャー。torch.is_grad_enabled(): 勾配計算が有効かどうかを確認します。
注意事項
is_inference_mode_enabled読み取り専用関数であり、状態を変更しません。- これは専ら検出に使用されます。
inference_mode、ではなくno_grad。 - に
inference_mode内の場合は、is_grad_enabledも返します。False、ただし逆は成り立ちません。 - 汎用コードを書くときは、この関数を使用して異なる実行モードを区別できます。
その他の拡張機能
Pytorch torch リファレンスマニュアル