# Terminal python net.py
# necessities.txt torch transformers flask gunicorn
# net.py
from flask import Flask, request
import detector as detector
app = Flask(__name__)
@app.route('/verify', strategies=["POST"])
def handle_request():
immediate = request.type.get("immediate")
if not immediate:
return { "error": "immediate parameter is required" }, 400
detection = detector.detect(immediate)
return { "spam": bool(detection)}
app.run(host="0.0.0.0", port=8000)
# detector.py
import torch
from transformers import RobertaTokenizer, RobertaForSequenceClassification
if torch.cuda.is_available():
print("USING CUDA")
gadget = torch.gadget("cuda")
elif torch.backends.mps.is_available():
print("USING Apple Steel")
gadget = torch.gadget("mps")
else:
print("USING CPU")
gadget = torch.gadget("cpu")
model_path = "mshenoda/roberta-spam"
tokenizer = RobertaTokenizer.from_pretrained(model_path)
mannequin = RobertaForSequenceClassification.from_pretrained(model_path, num_labels=2).to(gadget)
def detect(textual content):
inputs = tokenizer(textual content, return_tensors="pt", padding="max_length", truncation=True, max_length=512)
inputs = {okay: v.to(gadget) for okay,v in inputs.objects()}
with torch.no_grad():
outputs = mannequin(**inputs)
return torch.argmax(outputs.logits, dim=1)
# Dockerfile FROM python:3.11.6 RUN apt replace && apt improve -y WORKDIR /app COPY . /app RUN pip set up --no-cache-dir -r necessities.txt ENV NVIDIA_VISIBLE_DEVICES=all ENV NVIDIA_DRIVER_CAPABILITIES=compute,utility EXPOSE 5000 CMD ["gunicorn -w 2 -b 0.0.0.0:5000 web:app"]
# docker-compose.yml
model: '3.8'
providers:
app:
# picture: USERNAME/IMAGE:newest
command: gunicorn -w 2 -b 0.0.0.0:5000 net:app
ports:
- 5000:5000
setting:
- NVIDIA_VISIBLE_DEVICES=all
- NVIDIA_DRIVER_CAPABILITIES=compute,utility
deploy:
assets:
reservations:
units:
- capabilities: [gpu]
volumes:
- /root/model-cache:/root/.cache
# Terminal rails g migration add_spam_fields_to_comments spam:boolean spam_checked_on:datetime rails g job CheckForSpam
# db/migrate/20231105020507_add_spam_fields_to_comments.rb
class AddSpamFieldsToComments < ActiveRecord::Migration[7.1]
def change
add_column :feedback, :spam, :boolean, default: false
add_column :feedback, :spam_checked_on, :datetime
finish
finish
# app/fashions/remark.rb
class Remark < ApplicationRecord
has_rich_text :content material
belongs_to :submit
broadcasts_to :submit
# after_create_commit -> { broadcast_append_to submit }
after_create_commit -> { CheckForSpamJob.perform_later self }
# after_update_commit -> { broadcast_replace_to submit }
# after_destroy_commit -> { broadcast_remove_to submit }
finish
# app/jobs/check_for_spam_job.rb
require "web/http"
require "uri"
require "json"
class CheckForSpamJob < ApplicationJob
queue_as :default
def carry out(remark)
immediate = remark.content material.to_plain_text
uri = URI.parse("http://127.0.0.1:8000/verify")
http = Web::HTTP.new(uri.host, uri.port)
http.use_ssl = true if uri.scheme == "https"
http.open_timeout = 10
http.read_timeout = 10
request = Web::HTTP::Publish.new(uri.request_uri)
request.set_form_data({ immediate: immediate })
response = http.request(request)
consequence = JSON.parse(response.physique)
if outlined?(consequence["spam"])
# remark.replace(spam_checked_on: Time.now, spam: consequence["spam"])
remark.destroy if consequence["spam"]
else
# retry
finish
rescue StandardError => e
# retry
finish
finish
# app/views/feedback/_comment.html.erb
<%= turbo_frame_tag dom_id(remark), class: "card my-3 shadow-sm" do %>
<%= content_tag :div, class: "card-header #{remark.spam? ? "bg-danger" : "bg-primary"} text-white" do %>
<div class="">
Commented on <%= remark.updated_at.strftime("%B %d, %Y at %l:%M %p") %>
</div>
<% finish %>
<%= content_tag :div, class: "card-body #{remark.spam? ? "bg-danger-subtle" : "bg-primary-subtle"}" do %>
<p class="card-text"><%= remark.content material %></p>
<% finish %>
<div class="card-footer bg-transparent">
<%= link_to "Edit", [:edit, comment.post, comment], class: 'btn btn-outline-secondary btn-sm me-2' %>
<%= link_to "Delete", [comment.post, comment], "data-turbo-method": :delete, "data-turbo-confirm": "Are you positive?", class: 'btn btn-outline-danger btn-sm' %>
</div>
<% finish %>
# app/controllers/comments_controller.rb def index # @feedback = @submit.feedback.order(updated_at: :asc) @feedback = @submit.feedback.the place(spam: false).order(updated_at: :asc) finish

