π¨βπ»πΒ [Python] Object Attribute & Assertion Function
𧧠Attribute Function
μ΄λ² ν¬μ€ν
μ Python
μ½λλ₯Ό μμ±νλ©΄μ κ°μ²΄μ λ΄λΆ λ©μλμ κ΄λ ¨ν μ²λ¦¬κ° νμν λ κ°μ₯ λ§μ΄ μ¬μ©νκ² λλ getattr
, setattr
, delattr
, hasttr
ν¨μλ€μ μ¬μ©λ²μ λν΄ λ€λ€λ³΄λ € νλ€. νΉν getattr
, setattr
μ κ²½μ° λ¨Έμ λ¬λ νΉμ λ₯λ¬λ κ΄λ ¨ μ½λλ₯Ό μ½λ€κ° μ¬μ¬μΉ μκ² μ°Ύμλ³Ό μ μλ€. λͺ¨λΈμ hyper-parameter
λ₯Ό νλνκ±°λ κΈ°ν μ€νμ ν λ μ μν κ°μ²΄μ λ³μ νΉμ λ©μλμ μ½κ³ κ°κ²°νκ² μ κ·ΌνκΈ° μν΄ μ¬μ©λκ³ μκΈ° λλ¬Έμ΄λ€.
π getattr
""" getattr(object, attribute_name, default) """
class CFG:
"""--------[Common]--------"""
wandb, train, competition, seed, cfg_name = True, True, 'UPPPM', 42, 'CFG'
device, gpu_id = torch.device('cuda' if torch.cuda.is_available() else 'cpu'), 0
num_workers = 0
""" Mixed Precision, Gradient Check Point """
amp_scaler = True
gradient_checkpoint = True # save parameter
output_dir = './output/'
""" Clipping Grad Norm, Gradient Accumulation """
clipping_grad = True # clip_grad_norm
n_gradient_accumulation_steps = 1 # Gradient Accumulation
max_grad_norm = n_gradient_accumulation_steps * 1000
""" Model """
model_name = 'microsoft/deberta-v3-large'
tokenizer = AutoTokenizer.from_pretrained(model_name)
# pooling = 'attention'
max_len = 512
""" CV, Epoch, Batch Size """
n_folds = 4
epochs = 180
batch_size = 64
μμ κ°μ²΄λ μ€μ μ κ° μΊκΈ λνλ₯Ό μ€λΉνλ©΄μ μ¬μ©νλ config.py
λ₯Ό κ°μ Έμλ€.
getattr(object: object, attribute_name: str, default: Any)
ν¨μλ μ¬μ©μκ° μ§μ ν κ°μ²΄μ 맀κ°λ³μλ‘ μ λ¬ν attribute
κ° μ‘΄μ¬νλμ§ μ¬λΆλ₯Ό νλ¨νκ³ , μ‘΄μ¬νλ€λ©΄ ν΄λΉ attribute
μ value
λ₯Ό λ°ννλ€. ννΈ μ‘΄μ¬νμ§ μμΌλ©΄ default
λ‘ μΈν
ν κ°μ λ°ννλ€.
getattr(CFG, 'epochs', "This Attribute doesn't find")
getattr(CFG, 'MPL', "This Attribute doesn't find")
--------------- Result ---------------
180
This Attribute doesn't find
if-else
κ΅¬λ¬Έλ³΄λ€ ν¨μ¬ κ°κ²°νκ² κ°μ²΄μ λ©μλμ μ κ·Όνλ κ²μ΄ κ°λ₯ν΄μ‘μΌλ©°, default
κ°μ 맀κ°λ³μλ‘ μ λ¬ λ°κΈ° λλ¬Έμ ν΄λΌμ΄μΈνΈκ° μ§μ ν attribute
κ° κ°μ²΄ λ΄λΆμ μμ΄λ AttributeError
λ₯Ό λ°μμν€μ§ μμ μμΈ μ²λ¦¬λ₯Ό λ³λλ‘ μ§μ ν νμκ° μ¬λΌμ Έ μ½λ κ°λ
μ± λ° μ μ§λ³΄μμ μ©μ΄νλ€λ μ₯μ μ΄ μλ€.
class Exmple:
def __init__(self):
self.test1 = 0
self.test2 = 0
def A(self):
print("A")
def B(self):
print("B")
def C(self):
print("C")
if __name__ == '__main__':
exmple = Exmple()
class_list = ['A','B','C']
for c in class_list:
getattr(exmple, c)()
ννΈ getattr()
λ€μ κ΄νΈλ₯Ό νλ λ λΆμ¬μ μ¬μ©νκΈ°λ(λ¨Έμ λ¬λ, λ₯λ¬λ νλ ¨ 루ν μ½λμ μ’
μ’
보μ) νλλ°, ν΄λΉ κ΄νΈλ μ§μ attribute
μ νΈμΆμ νμν 맀κ°λ³μλ₯Ό μ λ¬νκΈ° μν μ©λλ‘ μ°μΈλ€. μ΄λ² μμμ κ°μ²΄ λ΄λΆ λ©μλλ€μ νΈμΆμ νμν 맀κ°λ³μκ° μ μλμ΄ μμ§ μκΈ° λλ¬Έμ κ΄νΈ μμ λΉμλλ€.
βοΈ setattr
""" setattr(object, attribute_name, value) """
class CFG:
"""--------[Common]--------"""
wandb, train, competition, seed, cfg_name = True, True, 'UPPPM', 42, 'CFG'
device, gpu_id = torch.device('cuda' if torch.cuda.is_available() else 'cpu'), 0
num_workers = 0
""" Mixed Precision, Gradient Check Point """
amp_scaler = True
gradient_checkpoint = True # save parameter
output_dir = './output/'
""" Clipping Grad Norm, Gradient Accumulation """
clipping_grad = True # clip_grad_norm
n_gradient_accumulation_steps = 1 # Gradient Accumulation
max_grad_norm = n_gradient_accumulation_steps * 1000
""" Model """
model_name = 'microsoft/deberta-v3-large'
tokenizer = AutoTokenizer.from_pretrained(model_name)
# pooling = 'attention'
max_len = 512
""" CV, Epoch, Batch Size """
n_folds = 4
epochs = 180
batch_size = 64
setattr(object: object, attribute_name: str, value: Any)
λ μ§μ κ°μ²΄μ μ§μ λ©μλ νΉμ λ³μμ μ κ·Όνκ³ μ μ΄νλ μ©λλ‘ μ¬μ©νλ ν¨μλ€. μ§μ κ°μ²΄ λ¨μλ‘ μ κ·Ό κ°λ₯νκΈ° λλ¬Έμ λͺ¨λΈμ νλν λ μ λ§ λ§μ΄ μ¬μ©νκ² λλ€. setattr()
λ₯Ό νμ©ν΄ μν©μ λ§λ νλΌλ―Έν°λ₯Ό λͺ¨λΈμ μ£Όμ
νκ³ ν΄λΉ config
λ₯Ό json
νΉμ yaml
νμμΌλ‘ μ μ₯ν΄λλ©΄ λͺ¨λΈμ λ²μ λ³ νλΌλ―Έν° κ°μ ν¨μ¨μ μΌλ‘ κ΄λ¦¬ν μ μμΌλ κΈ°μ΅ν΄λμ.
CFG.wandb
setattr(CFG, 'wandb', False)
CFG.wandb
setattr(CFG, 'wandb', True)
CFG.wandb
--------------- Result ---------------
True
False
True
π hasattr
hasattr(object, attribute_name)
λ μ§μ κ°μ²΄μ 맀κ°λ³μλ‘ μ λ¬ν attribute
κ° μ‘΄μ¬νλ©΄ True
, μλ€λ©΄ False
λ₯Ό λ°ννλ€. μ¬μ©λ²μ getattr()
μ λ§€μ° μ μ¬νκΈ° λλ¬Έμ μλ΅νλ€.
βοΈ delattr
delattr(object, attribute_name)
λ μ§μ κ°μ²΄μ 맀κ°λ³μλ‘ μ λ¬ν attribute
λ₯Ό κ°μ²΄ λ΄λΆμμ μμ νλ μν μ νλ€. μ¬μ© μμλ μλμ κ°λ€.
delattr(CFG, 'epochs')
hasattr(CFG, 'epochs')
--------------- Result ---------------
False
ννΈ, λͺ¨λ(ex: config,py, model.py, model_utils.py λ±)λ κ°μ²΄λ‘ κ°μ£ΌλκΈ° λλ¬Έμ μμμ μ΄ν΄λ³Έ 4κ°μ§ functionμ λͺ¨λ λ 벨μμλ λμΌνκ² μ¬μ©ν μ μλ€.
β οΈ Assertion
assert 쑰건, λ©μΈμ§
μ‘°κ±΄μ΄ Trueμ΄λ©΄ μλ¬΄λ° μΌμ΄ μΌμ΄λμ§ μλλ€. νμ§λ§ μ‘°κ±΄μ΄ Falseμ΄λ©΄ AssertionErrorκ° λ°μνκ³ μ§μ ν λ©μΈμ§κ° μΆλ ₯λλ€. λ©μΈμ§λ₯Ό μ§μ νμ§ μμλ€λ©΄ AssertionError
κ° λμΌνκ² λ°μνμ§λ§ ꡬ체μ μΈ μλ¬ λͺ
μλμ λΉμμ§ μ±λ‘ λ‘κ·Έκ° μΆλ ₯λλ€.
assert
λ μ½λμ μ€λ₯λ₯Ό μ°Ύλ λ° μ μ©νλ€. λν μ½λμ μλλ₯Ό λͺ
ννκ² νννλ λ°μλ μ μ©νλ€. μλ₯Ό λ€μ΄, λ³μμ κ°μ΄ νΉμ 쑰건μ λ§μ‘±ν΄μΌ νλ€λ κ²μ assert
λ₯Ό μ¬μ©ν΄ ννν μ μλ€.
assert
λ μλ¬ λ‘κ·Έλ₯Ό λ°ννλ©΄μ κ°λ°μκ° νλ‘κ·Έλ¨μ λ§λλ κ³Όμ μ κ΄μ¬νλ€. μνλ 쑰건μ λ³μ κ°μ 보μ¦λ°μ λκΉμ§ assert
λ‘ ν
μ€νΈ ν μ μλ€. μ΄λ λ°μ΄ν° μ ν¨μ± κ²μ¬μ²λΌ λ¨μν μλ¬λ₯Ό μ°Ύλκ²μ΄ μλλΌ κ°μ 보μ¦νκΈ° μν΄ μ¬μ©λλ€. μλ₯Ό λ€μ΄ ν¨μμ μ
λ ₯ κ°μ΄ μ΄λ€ 쑰건μ μ°Έμμ 보μ¦νκΈ° μν΄ μ¬μ©ν μ μκ³ ν¨μμ λ°ν κ°μ΄ μ΄λ€ 쑰건μ λ§μ‘±νλλ‘ λ§λ€ μ μλ€. νΉμ λ³μ κ°μ΄ λ³νλ κ³Όμ μμ νΉμ λΆλΆμ λ°λμ μ΄λ€ μμμ μνλ κ²μ 보μ¦νκΈ° μν΄ κ°μ μ€μ λ¬Έμ ν΅ν΄ νμΈ ν μλ μλ€. assert
λ μ€μλ₯Ό κ°μ ν΄ κ°μ 보μ¦νλ λ°©μμΌλ‘ μ½λ© νκΈ° λλ¬Έμ 'λ°©μ΄μ νλ‘κ·Έλλ°'
μ μνλ€. λ°©μ΄μ νλ‘κ·Έλλ°μ λν μμΈν λ΄μ©μ λ€μ ν¬μ€νΈμμ μ΄ν΄λ³΄λλ‘ νμ.
# Python assert λ°μ΄ν° μ ν¨μ± κ²μ¬ μμ
class DeBERTa(nn.Module):
def __init__(self,):
...μ€λ΅...
def forward(self, inputs: Tensor, mask: Tensor):
assert inputs.ndim == 3, f'Expected (batch, sequence, vocab_size) got {inputs.shape}'
...μ€λ΅...
μμ μ½λλ νμκ° λ
Όλ¬Έμ λ³΄κ³ λ°λΌ ꡬνν DeBERTa
λͺ¨λΈ μ΅μμ κ°μ²΄μ μ½λ μΌλΆλΆμ΄λ€. μ΅μμ κ°μ²΄λ λͺ¨λΈμ μ
λ ₯ μλ² λ© μΈ΅κ³Ό μμΉ μλ² λ© μΈ΅μ μ μν΄μ€μΌ νκΈ° λλ¬Έμ λ°λμ μ
λ ₯κ°μ 미리 μ ν΄μ§ μ°¨μ νμμ λ§κ² κ°μ²΄μ λ§€κ° λ³μλ‘ λ겨μ€μΌ νλ€. μ§μ νμμμ λ²μ΄λ ν
μλ μ
λ ₯μΌλ‘ μ¬μ©λ μ μκ² λ§λ€κΈ° μν΄ κ°μ²΄μ forward
λ©μλ μμλΆλΆμ assert
ν¨μλ₯Ό λμ΄ λ°μ΄ν° μ ν¨μ± κ²μ¬λ₯Ό νλλ‘ κ΅¬ννλ€. μ§μ λ μ°¨μ ννμ λ§μ§ μλ λ°μ΄ν°λ₯Ό μ
λ ₯νκ² λλ©΄ AssertionError
μ ν¨κ» νμκ° μ§μ ν μλ¬ λ©μΈμ§λ₯Ό λ°ν λ°κ² λ κ²μ΄λ€.
ννΈ AssertionError
λ νλ‘κ·Έλλ¨Έκ° μλμ λ§μ§ μλ λ©μλ νΉμ κ°μ²΄ μ¬μ©μ λ§κΈ° μν΄ μ μ μ μΌλ‘ λμν κ²μ΄λΌκ³ λ³Ό μ μλ€. μ΄λ νλ‘κ·Έλλ¨Έκ° λ§λ κ·μΉμ ν΄λΉν λΏ, μ€μ νμ΄μ¬μ΄λ μ»΄ν¨ν° λ΄λΆ λμ λ¬Έλ²μ νλ Έλ€λ κ²μ μλ―Ένλ κ²μ μλλ€.
Leave a comment