agencies

deepdfa + linevul 운영(초안)단계 시도해보기! 본문

Ⅳ. 기타

deepdfa + linevul 운영(초안)단계 시도해보기!

agencies 2024. 11. 20. 18:10

colab 마운트

from google.colab import drive
drive.mount('/content/drive')

 

모델 평가모드로 진행(strict=false 를 사용해서 걱정된다)

import torch
import torch.nn as nn
from torch.nn import CrossEntropyLoss
from transformers import RobertaModel, RobertaConfig, RobertaTokenizer, RobertaForSequenceClassification
from DeepDFA.DDFA.code_gnn.models.flow_gnn.ggnn import FlowGNNGGNNModule

# FlowGNNGGNNModule 초기화
flowgnn_encoder = FlowGNNGGNNModule(
    feat="_ABS_DATAFLOW",       # 사용하려는 특징 키 (예: "_ABS_DATAFLOW")
    input_dim=128,             # 입력 차원 (특성 개수)
    hidden_dim=128,            # 숨겨진 상태 크기
    n_steps=5,                 # GGNN의 업데이트 스텝 수
    num_output_layers=2,       # 출력 레이어 수
    label_style="graph",       # 그래프 기반 예측
    concat_all_absdf=False,    # 모든 특성 결합 여부
    encoder_mode=True          # 출력 임베딩 활성화
)

# RobertaClassificationHead 클래스 정의
class RobertaClassificationHead(nn.Module):
    """Head for sentence-level classification tasks."""
    def __init__(self, config, extra_dim):
        super().__init__()
        self.dense = nn.Linear(config.hidden_size + extra_dim, config.hidden_size)
        self.dropout = nn.Dropout(config.hidden_dropout_prob)
        self.out_proj = nn.Linear(config.hidden_size, 2)

    def forward(self, features, flowgnn_embed, **kwargs):
        x = features[:, 0, :]  # take <s> token (equiv. to [CLS])
        if flowgnn_embed is not None:
            x = torch.cat((x, flowgnn_embed), dim=1)
        x = self.dropout(x)
        x = self.dense(x)
        x = torch.tanh(x)
        x = self.dropout(x)
        x = self.out_proj(x)
        return x

# Model 클래스 정의
class Model(RobertaForSequenceClassification):   
    def __init__(self, encoder, flowgnn_encoder, config, tokenizer, args):
        super(Model, self).__init__(config=config)
        self.encoder = encoder
        if not args.no_flowgnn:
            self.flowgnn_encoder = flowgnn_encoder
        self.tokenizer = tokenizer
        self.classifier = RobertaClassificationHead(config, 0 if args.no_flowgnn else self.flowgnn_encoder.out_dim)
        self.args = args

    def forward(self, input_embed=None, labels=None, graphs=None, output_attentions=False, input_ids=None):
        if self.args.no_flowgnn:
            flowgnn_embed = None
        elif graphs is not None:
            flowgnn_embed = self.flowgnn_encoder(graphs, {})
        if output_attentions:
            if input_ids is not None:
                outputs = self.encoder.roberta(input_ids, attention_mask=input_ids.ne(1), output_attentions=output_attentions)
            else:
                outputs = self.encoder.roberta(inputs_embeds=input_embed, output_attentions=output_attentions)
            attentions = outputs.attentions
            last_hidden_state = outputs.last_hidden_state
            logits = self.classifier(last_hidden_state, flowgnn_embed)
            prob = torch.softmax(logits, dim=-1)
            if labels is not None:
                loss_fct = CrossEntropyLoss()
                loss = loss_fct(logits, labels)
                return loss, prob, attentions
            else:
                return prob, attentions
        else:
            if input_ids is not None:
                outputs = self.encoder.roberta(input_ids, attention_mask=input_ids.ne(1), output_attentions=output_attentions)[0]
            else:
                outputs = self.encoder.roberta(inputs_embeds=input_embed, output_attentions=output_attentions)[0]
            logits = self.classifier(outputs, flowgnn_embed)
            prob = torch.softmax(logits, dim=-1)
            if labels is not None:
                loss_fct = CrossEntropyLoss()
                loss = loss_fct(logits, labels)
                return loss, prob
            else:
                return prob

# 로버타 토크나이저 로드
tokenizer = RobertaTokenizer.from_pretrained("roberta-base")

# 로버타 설정 생성
config = RobertaConfig.from_pretrained("roberta-base")

# 사전 학습된 RoBERTa 모델 로드
encoder = RobertaModel.from_pretrained("roberta-base")

# Args 클래스 정의
class Args:
    def __init__(self):
        self.no_flowgnn = False  # FlowGNN 사용 여부

args = Args()

# 모델 초기화
model = Model(
    encoder=encoder,
    flowgnn_encoder=flowgnn_encoder,  # FlowGNN 활성화
    config=config,
    tokenizer=tokenizer,
    args=args
)

# 저장된 가중치 로드
model_path = "/content/drive/MyDrive/model.bin"
state_dict = torch.load(model_path, map_location=torch.device('cpu'))



# 가중치 키 확인
print(state_dict.keys())


#model.load_state_dict(state_dict)
model.load_state_dict(state_dict, strict=False)

model.eval()

 

before 폴더의 0.c를 가지고오

# test.c 파일 읽기
test_code_path = "0.c"
with open(test_code_path, "r") as file:
    test_code = file.read()

print("Test Code:\n", test_code)

 

 

input_ids와 attention_mask 까지는 잘 출력되는데 그 밑 부분이 안된다.

# 토크나이저를 사용하여 입력 텐서 생성
inputs = tokenizer(
    test_code,
    max_length=512,           # 입력의 최대 길이
    padding="max_length",     # 최대 길이에 맞춰 패딩
    truncation=True,          # 입력을 자를지 여부
    return_tensors="pt"       # 텐서 형식 반환
)

# input_ids와 attention_mask 생성
input_ids = inputs["input_ids"]
attention_mask = inputs["attention_mask"]

print(input_ids)
print(attention_mask)


# 모델 평가
model.eval()
with torch.no_grad():
    # 모델 예측
    outputs = model(input_ids=input_ids, attention_mask=attention_mask)
    logits = outputs[0]

# 확률 계산
probs = torch.softmax(logits, dim=-1)
predicted_label = torch.argmax(probs, dim=1).item()

# 결과 출력
print("Source Code:", test_code)
print("Predicted Probabilities (Non-Vulnerable, Vulnerable):", probs)
print("Predicted Label:", "Vulnerable (1)" if predicted_label == 1 else "Non-Vulnerable (0)")

 

 

 


GPU 런타임 이슈로 더이상 시도 불가...