{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "fA5xQbsbwVet", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "fA5xQbsbwVet", "outputId": "fb1608be-334d-4eb6-fc71-eab1fe46abae" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Using device: cuda\n", "Tesla T4\n" ] } ], "source": [ "import torch\n", "DEVICE = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", "print(\"Using device:\", DEVICE)\n", "\n", "if DEVICE == \"cuda\":\n", " print(torch.cuda.get_device_name(0))\n" ] }, { "cell_type": "code", "execution_count": 2, "id": "4CDmKstGwXBF", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "4CDmKstGwXBF", "outputId": "21c5de81-eeab-46fc-e9d3-8ea0ee00d5c6" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: sentencepiece in /usr/local/lib/python3.12/dist-packages (0.2.1)\n", "Requirement already satisfied: tqdm in /usr/local/lib/python3.12/dist-packages (4.67.1)\n" ] } ], "source": [ "pip install sentencepiece tqdm\n" ] }, { "cell_type": "code", "execution_count": 3, "id": "l7v2mVb72lUv", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "l7v2mVb72lUv", "outputId": "d3b68112-dcab-4a8d-b139-f70c01ed265f" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n" ] } ], "source": [ "from google.colab import drive\n", "drive.mount('/content/drive')" ] }, { "cell_type": "code", "execution_count": null, "id": "_n9XjMoEbODd", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "_n9XjMoEbODd", "outputId": "2ee5e2c8-882a-4554-a413-2e1973215117" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Archive: /content/drive/MyDrive/drive-download-20260131T045434Z-3-001.zip\n", "replace /content/temple_dataset/__MACOSX/._drive-download-20260131T045434Z-3-001? [y]es, [n]o, [A]ll, [N]one, [r]ename: A\n", " inflating: /content/temple_dataset/__MACOSX/._drive-download-20260131T045434Z-3-001 \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/.DS_Store \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/._.DS_Store \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/._Mithulan \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/._Samyuktha \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/._Saravanan_ \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/._Athilakshmi \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/._Dinesh \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/._Thavasi \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Mithulan /.DS_Store \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Mithulan /._.DS_Store \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Mithulan /._abhirami_salem _temple \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Mithulan /._Aswin_madurai_temple \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Mithulan /._Mithulan_krishnagiri_temple \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Samyuktha /sivagangai.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Samyuktha /._sivagangai.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Samyuktha /Puthukottai._temples.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Samyuktha /._Puthukottai._temples.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Samyuktha /Erode_temples.zip \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Samyuktha /._Erode_temples.zip \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Samyuktha /Copy of villupuram.zip \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Samyuktha /._Copy of villupuram.zip \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Samyuktha /ramanadhapuram.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Samyuktha /._ramanadhapuram.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Samyuktha /Copy of ramanadhapuram.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Samyuktha /._Copy of ramanadhapuram.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Samyuktha /vellore_ranipet_temples.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Samyuktha /._vellore_ranipet_temples.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Samyuktha /theni_districts_final.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Samyuktha /._theni_districts_final.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Samyuktha /Kanchiburam_Temples.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Samyuktha /._Kanchiburam_Temples.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Samyuktha /copy_of_erode.zip \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Samyuktha /._copy_of_erode.zip \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Samyuktha /erode.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Samyuktha /._erode.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Samyuktha /copy_of_villupuram.zip \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Samyuktha /._copy_of_villupuram.zip \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Athilakshmi /._collected data \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Athilakshmi /.DS_Store \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Athilakshmi /._.DS_Store \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Madurai temples(41-60).json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /._Madurai temples(41-60).json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /1-20 Temples.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /._1-20 Temples.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /.DS_Store \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /._.DS_Store \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Day 1 kallakurichi District.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /._Day 1 kallakurichi District.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Day 2 Thanjavur District Temples.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /._Day 2 Thanjavur District Temples.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /ariyalur day-1.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /._ariyalur day-1.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Tirupattur day-3.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /._Tirupattur day-3.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Temples day-5.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /._Temples day-5.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Day 1 Thanjavur District Temples.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /._Day 1 Thanjavur District Temples.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Tirupattur Day-4.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /._Tirupattur Day-4.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Day 2 mayiladuthurai District Temples.txt \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /._Day 2 mayiladuthurai District Temples.txt \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Day 2 Dindigul.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /._Day 2 Dindigul.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /._Karthik.S - Day-2 - Thrichy district temples \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Additional Temples 80-100.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Day 1 mayiladuthurai District Temples.txt \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /._Day 1 mayiladuthurai District Temples.txt \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Day1 Dindugal temples.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /._Day1 Dindugal temples.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Day 2 Kallakurichi District.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /._Day 2 Kallakurichi District.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Day 3 Dindigul.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /._Day 3 Dindigul.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Day 1&2 Kumbakonam Temples.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /._Day 1&2 Kumbakonam Temples.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Day 2 Cuddalore District Temples.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /._Day 2 Cuddalore District Temples.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /._Sai Vimenthan Day 3 Tirupattur \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /ariyalur day-2.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /._ariyalur day-2.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Day 1 Information on Temples.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /._Day 1 Information on Temples.json \n", " creating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /additional temples/\n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /._additional temples \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /._Karthik.S - Day-1 - Thrichy district temples \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /._Sai Vimenthan Tamil Districts Arailayur \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Day 1 Perambalur District Temples.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Day 1 Cuddalore District Temples.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /._Day 1 Cuddalore District Temples.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /virudhunagar.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /._virudhunagar.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /._Namakal_Temples_JSON \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /nagapattinam_temples.json.zip \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /._nagapattinam_temples.json.zip \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /tirunelveli_full_clean.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /._tirunelveli_full_clean.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /thiruvarur1.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /._thiruvarur1.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Mithulan /abhirami_salem _temple/salem temple.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Mithulan /abhirami_salem _temple/._salem temple.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Mithulan /Aswin_madurai_temple /madurai_temple_prompt.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Mithulan /Aswin_madurai_temple /._madurai_temple_prompt.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Mithulan /Mithulan_krishnagiri_temple/krishnagiri_temple.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Mithulan /Mithulan_krishnagiri_temple/._krishnagiri_temple.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Athilakshmi /collected data/athilakshmi_kanyakumari_temples.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Athilakshmi /collected data/._athilakshmi_kanyakumari_temples.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Athilakshmi /collected data/Sweatha_Athilakshmi_chennai.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Athilakshmi /collected data/._Sweatha_Athilakshmi_chennai.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Athilakshmi /collected data/Suruthi_Athilakshmi_coimbatore.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Athilakshmi /collected data/._Suruthi_Athilakshmi_coimbatore.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Athilakshmi /collected data/Suruthi_Athilakshmi_coimbatore(2).json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Athilakshmi /collected data/._Suruthi_Athilakshmi_coimbatore(2).json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Athilakshmi /collected data/Suruthi_Athilakshmi_coimbatore(3).json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Athilakshmi /collected data/._Suruthi_Athilakshmi_coimbatore(3).json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Athilakshmi /collected data/Suruthi_Athilakshmi_thiruvannamalai(2).json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Athilakshmi /collected data/._Suruthi_Athilakshmi_thiruvannamalai(2).json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Athilakshmi /collected data/athilakshmi_vellore_temples.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Athilakshmi /collected data/._athilakshmi_vellore_temples.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Athilakshmi /collected data/Sweatha_Athilakshmi_Thoothukudi.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Athilakshmi /collected data/._Sweatha_Athilakshmi_Thoothukudi.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Athilakshmi /collected data/Suruthi_Athilakshmi_Thiruvannamalai.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Athilakshmi /collected data/._Suruthi_Athilakshmi_Thiruvannamalai.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/பெருங்குடி.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._பெருங்குடி.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/திருச்செந்துறை சந்திரசேகரர் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._திருச்செந்துறை சந்திரசேகரர் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/உத்தமர் கோவில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._உத்தமர் கோவில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/திருஅன்பில் அல்லது சுந்தரராஜ பெருமாள் கோவில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._திருஅன்பில் அல்லது சுந்தரராஜ பெருமாள் கோவில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/பெருந்துறைப்பேராட்டியார் உடனுறை சப்தரிஷீஸ்வரர் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._பெருந்துறைப்பேராட்டியார் உடனுறை சப்தரிஷீஸ்வரர் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/திருப்பாற்றுறை ஆதிமூலேசுவரர் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._திருப்பாற்றுறை ஆதிமூலேசுவரர் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/புட்ளூர் அங்கல பரமேஸ்வரி அம்மன் கோவில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._புட்ளூர் அங்கல பரமேஸ்வரி அம்மன் கோவில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/காட்டுப்புத்தூர் மீனாட்சி சுந்தரேசுவரர் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._காட்டுப்புத்தூர் மீனாட்சி சுந்தரேசுவரர் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/பிரசன்ன வெங்கடாசலபதி கோவில், துறையூர்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._பிரசன்ன வெங்கடாசலபதி கோவில், துறையூர்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/Ranganathaswamy Temple.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._Ranganathaswamy Temple.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/பஞ்சவர்ணசுவாமி கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._பஞ்சவர்ணசுவாமி கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/ஜம்புகேஸ்வரர் கோவில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._ஜம்புகேஸ்வரர் கோவில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/பெட்டவைத்தலை மத்யர்ஜுனேஸ்வரர் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._பெட்டவைத்தலை மத்யர்ஜுனேஸ்வரர் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/மாற்றுரைவரதீசுவரர் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._மாற்றுரைவரதீசுவரர் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/பூமிநாதர் கோயில், மண்ணச்சநல்லூர்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._பூமிநாதர் கோயில், மண்ணச்சநல்லூர்.json \n", " extracting: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/சோமரசம்பேட்டை காசிவிசுவநாதர் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._சோமரசம்பேட்டை காசிவிசுவநாதர் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/trichy temple.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._trichy temple.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/தாயுமானவர் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._தாயுமானவர் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/அருள்மிகு ஸ்ரீ மாரியம்மன் திருக்கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._அருள்மிகு ஸ்ரீ மாரியம்மன் திருக்கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/நீலிவனேஸ்வரர் அல்லது ஞீலிவனேஸ்வரர் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._நீலிவனேஸ்வரர் அல்லது ஞீலிவனேஸ்வரர் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/பிரம்மபுரீஸ்வரர் கோவில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._பிரம்மபுரீஸ்வரர் கோவில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/உச்சி பிள்ளையார் கோவில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._உச்சி பிள்ளையார் கோவில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/வயலூர் முருகன் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._வயலூர் முருகன் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/புண்டரீகாட்சன் பெருமாள் கோயில் (திருவெள்ளறை).json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._புண்டரீகாட்சன் பெருமாள் கோயில் (திருவெள்ளறை).json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/மாந்துறை அம்ரவணேஸ்வரர் கோவில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._மாந்துறை அம்ரவணேஸ்வரர் கோவில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/திருவெள்ளறை புண்டரீகாக்ஷப் பெருமாள் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._திருவெள்ளறை புண்டரீகாக்ஷப் பெருமாள் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/சுந்தரராஜ பெருமாள் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._சுந்தரராஜ பெருமாள் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/ஜம்புகேஸ்வரர் கோவில், திருவானைக்காவல்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._ஜம்புகேஸ்வரர் கோவில், திருவானைக்காவல்.json \n", " extracting: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/மேட்டுப்பாளையம் மார்கண்டேயசுவாமி கோயில்json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._மேட்டுப்பாளையம் மார்கண்டேயசுவாமி கோயில்json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/பிரசன்ன வெங்கடாசலபதி கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._பிரசன்ன வெங்கடாசலபதி கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/குணசீலம் பிரசன்ன வெங்கடாசலபதி விஷ்ணு கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._குணசீலம் பிரசன்ன வெங்கடாசலபதி விஷ்ணு கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/சமயபுரம் மாரியம்மன் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._சமயபுரம் மாரியம்மன் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/பச்சாம்பேட்டை ராமலிங்கேஸ்வரர் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._பச்சாம்பேட்டை ராமலிங்கேஸ்வரர் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/புண்டரீகாட்சன் பெருமாள் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._புண்டரீகாட்சன் பெருமாள் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/அருள்மிகு ஸ்ரீ மாரியம்மன் கோயில், சமயபுரம்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._அருள்மிகு ஸ்ரீ மாரியம்மன் கோயில், சமயபுரம்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/அருள்மிகு ஸ்ரீ மாரியம்மன் கோவில், சமயபுரம்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._அருள்மிகு ஸ்ரீ மாரியம்மன் கோவில், சமயபுரம்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/உத்தமர் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._உத்தமர் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/மேட்டுப்பாளையம் மார்கண்டேயசுவாமி கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._மேட்டுப்பாளையம் மார்கண்டேயசுவாமி கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/திருநெடுங்குளம் நெடுங்களநாதர் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._திருநெடுங்குளம் நெடுங்களநாதர் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/பூலகநாதர் கோவில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._பூலகநாதர் கோவில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/வராஹி அம்மன் கோவில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._வராஹி அம்மன் கோவில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/சுந்தரராஜ பெருமாள் கோவில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._சுந்தரராஜ பெருமாள் கோவில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/ஸ்ரீரங்கம் ரங்கநாதசுவாமி கோவில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._ஸ்ரீரங்கம் ரங்கநாதசுவாமி கோவில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/பெருந்துறைப் பெராட்டியார் உடனுறை சப்தரிஷீஸ்வரர் கோவில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._பெருந்துறைப் பெராட்டியார் உடனுறை சப்தரிஷீஸ்வரர் கோவில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/காசி விஸ்வநாதர் கோவில், பழையூர்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._காசி விஸ்வநாதர் கோவில், பழையூர்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/வேக்காளி அம்மன் கோவில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._வேக்காளி அம்மன் கோவில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/திருப்பராய்த்துறை பராய்த்துறைநாதர் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._திருப்பராய்த்துறை பராய்த்துறைநாதர் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/எறும்பீஸ்வரர் கோவில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._எறும்பீஸ்வரர் கோவில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/பசுபதீஸ்வரர் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._பசுபதீஸ்வரர் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/சமயபுரம் போஜீஸ்வரர் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/._சமயபுரம் போஜீஸ்வரர் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Sai Vimenthan Day 3 Tirupattur /Thirupattur day-3.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Sai Vimenthan Day 3 Tirupattur /._Thirupattur day-3.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /additional temples/பூங்கா முருகன் கோவில், தள்ளாகுளம், மதுரை.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /additional temples/._பூங்கா முருகன் கோவில், தள்ளாகுளம், மதுரை.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /additional temples/நேரகோவில் ஸ்ரீ காலா தேவி அம்மன் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /additional temples/._நேரகோவில் ஸ்ரீ காலா தேவி அம்மன் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /additional temples/பிரசன்ன வெங்கடாசலபதி திருக்கோவில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /additional temples/._பிரசன்ன வெங்கடாசலபதி திருக்கோவில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /additional temples/temples.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /additional temples/._temples.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /additional temples/சோலைமலை முருகன் கோவில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /additional temples/._சோலைமலை முருகன் கோவில்.json \n", " extracting: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /additional temples/திருத்தணி சுப்பிரமணிய சுவாமி கோவில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /additional temples/._திருத்தணி சுப்பிரமணிய சுவாமி கோவில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /additional temples/ஹனுமான்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /additional temples/._ஹனுமான்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /additional temples/அருள்மிகு பிரசன்ன வெங்கடாசலபதி கோவில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /additional temples/._அருள்மிகு பிரசன்ன வெங்கடாசலபதி கோவில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /additional temples/விநாயகர்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /additional temples/._விநாயகர்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/temple-5.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/._temple-5.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/Pundarikakshan Perumal Temple.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/._Pundarikakshan Perumal Temple.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/வைரிசெட்டிபாளையம் அன்னகாமாட்சியம்மன் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/._வைரிசெட்டிபாளையம் அன்னகாமாட்சியம்மன் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/temple.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/._temple.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/திருவெறும்பூர் எறும்பீஸ்வரர் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/._திருவெறும்பூர் எறும்பீஸ்வரர் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/temple-4.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/._temple-4.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/மதுரை காளியம்மன் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/._மதுரை காளியம்மன் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/வளநாடு நாகம்மாள் கோவில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/._வளநாடு நாகம்மாள் கோவில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/Viralimalai Murugan Temple.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/._Viralimalai Murugan Temple.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/உறையூர் பாண்டமங்கலம் செல்லாண்டியம்மன் கோவில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/._உறையூர் பாண்டமங்கலம் செல்லாண்டியம்மன் கோவில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/உறையூர் வெக்காளியம்மன் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/._உறையூர் வெக்காளியம்மன் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/temple-3.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/._temple-3.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/temple-2.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/._temple-2.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/வயலூர் முருகன் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/._வயலூர் முருகன் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/சமயபுரம் மாரியம்மன் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/._சமயபுரம் மாரியம்மன் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/உத்தமர் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/._உத்தமர் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/திருவரங்கம் அரங்கநாத பெருமாள் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/._திருவரங்கம் அரங்கநாத பெருமாள் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/திருப்பைஞ்ஞீலி ஞீலிவனேசுவரர் கோயில்.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-1 - Thrichy district temples/._திருப்பைஞ்ஞீலி ஞீலிவனேசுவரர் கோயில்.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/kabilarmalai_sivan_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._kabilarmalai_sivan_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/erumapatti_amman_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._erumapatti_amman_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/paramathi_velur_karuppusamy_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._paramathi_velur_karuppusamy_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/kailasanathar_temple_kanchipuram_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._kailasanathar_temple_kanchipuram_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/puduchathiram_mariamman_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._puduchathiram_mariamman_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/mallasamudram_sivan_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._mallasamudram_sivan_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/alampatti_mariamman_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._alampatti_mariamman_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/kollimalai_mariamman_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._kollimalai_mariamman_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/ettukai_amman_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._ettukai_amman_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/mohanur_kailasanathar_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._mohanur_kailasanathar_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/namakkal_anjaneyar_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._namakkal_anjaneyar_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/chandikeswarar_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._chandikeswarar_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/nageswaraswamy_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._nageswaraswamy_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/belukurichi_mariamman_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._belukurichi_mariamman_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/tiruchengode_perumal_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._tiruchengode_perumal_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/sendamangalam_mariamman_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._sendamangalam_mariamman_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/agastheeswarar_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._agastheeswarar_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/rasipuram_kasi_viswanathar_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._rasipuram_kasi_viswanathar_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/vennandur_sivan_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._vennandur_sivan_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/paramathi_velur_mariamman_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._paramathi_velur_mariamman_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/chengode_velan_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._chengode_velan_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/badrakali_amman_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._badrakali_amman_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/vennandur_mariamman_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._vennandur_mariamman_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/kabilarmalai_murugan_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._kabilarmalai_murugan_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/kollimalai_sivan_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._kollimalai_sivan_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/ardhanareeswarar_temple_tiruchengode_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._ardhanareeswarar_temple_tiruchengode_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/navaladi_karuppaswami_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._navaladi_karuppaswami_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/mallasamudram_mariamman_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._mallasamudram_mariamman_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/mettala_hanuman_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._mettala_hanuman_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/tiruchengode_mariamman_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._tiruchengode_mariamman_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/pallipalayam_amman_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._pallipalayam_amman_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/arapaleeswarar_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._arapaleeswarar_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/bala_dhandayuthapani_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._bala_dhandayuthapani_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/nattatreeswarar_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._nattatreeswarar_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/dhandayuthapani_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._dhandayuthapani_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/belukurichi_perumal_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._belukurichi_perumal_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/rasipuram_mariamman_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._rasipuram_mariamman_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/elachipalayam_mariamman_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._elachipalayam_mariamman_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/thiruvannamalai_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._thiruvannamalai_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/namakkal_narasimhaswamy_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._namakkal_narasimhaswamy_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/massi_periyaswamy_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._massi_periyaswamy_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/velukkudi_amman_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._velukkudi_amman_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/kailasanathar_temple_tiruchengode_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._kailasanathar_temple_tiruchengode_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/ayyanar_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._ayyanar_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/kalappanaickenpatti_mariamman_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._kalappanaickenpatti_mariamman_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/namagiri_amman_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._namagiri_amman_temple_full.json \n", " inflating: /content/temple_dataset/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/kasi_viswanathar_temple_full.json \n", " inflating: /content/temple_dataset/__MACOSX/drive-download-20260131T045434Z-3-001/Thavasi /Namakal_Temples_JSON/._kasi_viswanathar_temple_full.json \n" ] } ], "source": [ "!unzip \"/content/drive/MyDrive/drive-download-20260131T045434Z-3-001.zip\" -d \"/content/temple_dataset\"" ] }, { "cell_type": "code", "execution_count": 5, "id": "4n6dD9VQya13", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "4n6dD9VQya13", "outputId": "4b8904d3-3551-48c9-be7c-f5e128b7221a" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/content/temple_dataset/drive-download-20260131T045434Z-3-001/Samyuktha /erode.json\n", "/content/temple_dataset/drive-download-20260131T045434Z-3-001/Samyuktha /Puthukottai._temples.json\n", "/content/temple_dataset/drive-download-20260131T045434Z-3-001/Samyuktha /sivagangai.json\n", "/content/temple_dataset/drive-download-20260131T045434Z-3-001/Samyuktha /vellore_ranipet_temples.json\n", "/content/temple_dataset/drive-download-20260131T045434Z-3-001/Samyuktha /Copy of ramanadhapuram.json\n", "/content/temple_dataset/drive-download-20260131T045434Z-3-001/Samyuktha /theni_districts_final.json\n", "/content/temple_dataset/drive-download-20260131T045434Z-3-001/Samyuktha /Kanchiburam_Temples.json\n", "/content/temple_dataset/drive-download-20260131T045434Z-3-001/Samyuktha /ramanadhapuram.json\n", "/content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Day 2 Kallakurichi District.json\n", "/content/temple_dataset/drive-download-20260131T045434Z-3-001/Dinesh /Karthik.S - Day-2 - Thrichy district temples/காட்டுப்புத்தூர் மீனாட்சி சுந்தரேசுவரர் கோயில்.json\n" ] } ], "source": [ "!find /content/temple_dataset -name \"*.json\" | head" ] }, { "cell_type": "code", "execution_count": 6, "id": "6757741d", "metadata": { "id": "6757741d" }, "outputs": [], "source": [ "import os\n", "import json\n", "import torch\n", "import torch.nn as nn\n", "import torch.nn.functional as F\n", "from glob import glob\n", "from torch.utils.data import Dataset, DataLoader\n", "import sentencepiece as spm\n", "from tqdm import tqdm\n" ] }, { "cell_type": "code", "execution_count": 7, "id": "4c1ae731", "metadata": { "id": "4c1ae731" }, "outputs": [], "source": [ "\n", "VOCAB_SIZE = 8000\n", "MAX_LEN = 512\n", "BATCH_SIZE = 32\n", "EPOCHS = 3\n", "LR = 3e-4\n" ] }, { "cell_type": "code", "execution_count": 8, "id": "67ca1226", "metadata": { "id": "67ca1226" }, "outputs": [], "source": [ "import json\n", "from glob import glob\n", "\n", "def load_texts(data_dir):\n", " texts = []\n", " bad = 0\n", "\n", " for path in glob(f\"{data_dir}/**/*.json\", recursive=True):\n", " try:\n", " with open(path, \"r\", encoding=\"utf-8\") as f:\n", " data = json.load(f)\n", "\n", " if isinstance(data, dict):\n", " t = data.get(\"text\", \"\")\n", " if isinstance(t, str) and len(t) > 300:\n", " texts.append(t)\n", "\n", " elif isinstance(data, list):\n", " for obj in data:\n", " if isinstance(obj, dict):\n", " t = obj.get(\"text\", \"\")\n", " if isinstance(t, str) and len(t) > 300:\n", " texts.append(t)\n", " except:\n", " bad += 1\n", "\n", " print(\"Loaded documents:\", len(texts))\n", " print(\"Bad files skipped:\", bad)\n", " return texts" ] }, { "cell_type": "code", "execution_count": 9, "id": "e68ae229", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "e68ae229", "outputId": "59cadcb1-0697-4a4b-dbe5-58d27bece79d" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Loaded documents: 3124\n", "Bad files skipped: 2\n", "Text-only docs: 3124\n", "பெரிய மாரியம்மன் கோயில், ஈரோடு நகரின் மிக முக்கியமான அம்மன் கோயிலாகும், ஈரோடு மாநகராட்சி கட்டிடத்திற்கு நேராக பன்னீர் செல்வம் பூங்கா அருகில் அமைந்துள்ளது. சுமார் 1200 ஆண்டுகளுக்கு முன் கோங்கு சோழர்களா\n" ] } ], "source": [ "DATA_DIR = \"/content/temple_dataset\"\n", "\n", "texts = load_texts(DATA_DIR)\n", "print(\"Text-only docs:\", len(texts))\n", "print(texts[0][:200])" ] }, { "cell_type": "code", "execution_count": 10, "id": "VWO8a54wkn0O", "metadata": { "id": "VWO8a54wkn0O" }, "outputs": [], "source": [ "def retrieve_context(query, texts, top_k=1):\n", " query = query.replace(\" \", \"\")\n", " scored = []\n", "\n", " for t in texts:\n", " score = t.count(query)\n", " if score > 0:\n", " scored.append((score, t))\n", "\n", " scored.sort(reverse=True, key=lambda x: x[0])\n", "\n", " if scored:\n", " return scored[0][1][:800] # limit context length\n", " return \"\"\n" ] }, { "cell_type": "code", "execution_count": 11, "id": "78dbWdL2wmWG", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "78dbWdL2wmWG", "outputId": "f6702943-e769-430e-b762-87d993326ccf" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SentencePiece trained and saved to Drive\n" ] } ], "source": [ "import sentencepiece as spm\n", "import os\n", "\n", "DRIVE_ROOT = \"/content/drive/MyDrive/Temple_LLM_Artifacts\"\n", "os.makedirs(DRIVE_ROOT, exist_ok=True)\n", "\n", "with open(\"spm_train.txt\", \"w\", encoding=\"utf-8\") as f:\n", " for t in texts:\n", " f.write(\" \".join(t.split()) + \"\\n\")\n", "\n", "VOCAB_SIZE = 8000\n", "MODEL_PREFIX = f\"{DRIVE_ROOT}/tamil_clm\"\n", "\n", "spm.SentencePieceTrainer.train(\n", " input=\"spm_train.txt\",\n", " model_prefix=MODEL_PREFIX,\n", " vocab_size=VOCAB_SIZE,\n", " model_type=\"bpe\",\n", " character_coverage=0.9995,\n", " pad_id=3,\n", " unk_id=0,\n", " bos_id=1,\n", " eos_id=2\n", ")\n", "\n", "print(\"SentencePiece trained and saved to Drive\")\n" ] }, { "cell_type": "code", "execution_count": 12, "id": "c7fd082c", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "c7fd082c", "outputId": "c52bfc30-b541-4e48-9489-ecdc3297f68e" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tokenizer vocab size OK: 8000\n" ] } ], "source": [ "sp = spm.SentencePieceProcessor()\n", "sp.load(\"/content/drive/MyDrive/Temple_LLM_Artifacts/tamil_clm.model\")\n", "\n", "assert sp.get_piece_size() == VOCAB_SIZE\n", "print(\"Tokenizer vocab size OK:\", VOCAB_SIZE)\n" ] }, { "cell_type": "code", "execution_count": 13, "id": "6f5d3fa3", "metadata": { "id": "6f5d3fa3" }, "outputs": [], "source": [ "class CLMDataset(Dataset):\n", " def __init__(self, texts):\n", " self.samples = []\n", " for t in texts:\n", " ids = sp.encode(t, out_type=int)\n", " ids = [i for i in ids if i < VOCAB_SIZE]\n", "\n", " for i in range(0, len(ids), MAX_LEN):\n", " chunk = ids[i:i + MAX_LEN]\n", " if len(chunk) >= 2:\n", " self.samples.append(torch.tensor(chunk, dtype=torch.long))\n", "\n", " def __len__(self):\n", " return len(self.samples)\n", "\n", " def __getitem__(self, idx):\n", " return self.samples[idx]\n" ] }, { "cell_type": "code", "execution_count": 14, "id": "50aca8a9", "metadata": { "id": "50aca8a9" }, "outputs": [], "source": [ "PAD_ID = 3\n", "\n", "def collate_fn(batch):\n", " max_len = max(x.size(0) for x in batch)\n", " out = torch.full((len(batch), max_len), PAD_ID, dtype=torch.long)\n", " for i, x in enumerate(batch):\n", " out[i, :x.size(0)] = x\n", " return out\n" ] }, { "cell_type": "code", "execution_count": 15, "id": "03e32c77", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "03e32c77", "outputId": "2f4e7a62-57d7-4ee7-89e6-6ad2fbdb07eb" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Training sequences: 20881\n" ] } ], "source": [ "dataset = CLMDataset(texts)\n", "dataloader = DataLoader(\n", " dataset,\n", " batch_size=BATCH_SIZE,\n", " shuffle=True,\n", " collate_fn=collate_fn\n", ")\n", "\n", "print(\"Training sequences:\", len(dataset))\n" ] }, { "cell_type": "code", "execution_count": 16, "id": "b4e1f4da", "metadata": { "id": "b4e1f4da" }, "outputs": [], "source": [ "class CausalSelfAttention(nn.Module):\n", " def __init__(self, dim, heads):\n", " super().__init__()\n", " self.heads = heads\n", " self.head_dim = dim // heads\n", " self.scale = self.head_dim ** -0.5\n", " self.qkv = nn.Linear(dim, dim * 3)\n", " self.out = nn.Linear(dim, dim)\n", "\n", " def forward(self, x):\n", " B, T, C = x.shape\n", " q, k, v = self.qkv(x).chunk(3, dim=-1)\n", "\n", " q = q.view(B, T, self.heads, self.head_dim).transpose(1, 2)\n", " k = k.view(B, T, self.heads, self.head_dim).transpose(1, 2)\n", " v = v.view(B, T, self.heads, self.head_dim).transpose(1, 2)\n", "\n", " att = (q @ k.transpose(-2, -1)) * self.scale\n", " mask = torch.tril(torch.ones(T, T, device=x.device))\n", " att = att.masked_fill(mask == 0, -1e9).softmax(dim=-1)\n", "\n", " out = (att @ v).transpose(1, 2).reshape(B, T, C)\n", " return self.out(out)\n" ] }, { "cell_type": "code", "execution_count": 17, "id": "1bac0319", "metadata": { "id": "1bac0319" }, "outputs": [], "source": [ "class Block(nn.Module):\n", " def __init__(self, dim, heads):\n", " super().__init__()\n", " self.ln1 = nn.LayerNorm(dim)\n", " self.ln2 = nn.LayerNorm(dim)\n", " self.attn = CausalSelfAttention(dim, heads)\n", " self.ff = nn.Sequential(\n", " nn.Linear(dim, 4 * dim),\n", " nn.SiLU(),\n", " nn.Linear(4 * dim, dim)\n", " )\n", "\n", " def forward(self, x):\n", " x = x + self.attn(self.ln1(x))\n", " x = x + self.ff(self.ln2(x))\n", " return x\n" ] }, { "cell_type": "code", "execution_count": 18, "id": "9b479953", "metadata": { "id": "9b479953" }, "outputs": [], "source": [ "class TamilCLM15M(nn.Module):\n", " def __init__(self):\n", " super().__init__()\n", " self.token = nn.Embedding(VOCAB_SIZE, 384)\n", " self.pos = nn.Embedding(MAX_LEN, 384)\n", " self.blocks = nn.ModuleList([Block(384, 6) for _ in range(6)])\n", " self.ln = nn.LayerNorm(384)\n", " self.head = nn.Linear(384, VOCAB_SIZE)\n", "\n", " def forward(self, x):\n", " B, T = x.shape\n", " pos = torch.arange(T, device=x.device)\n", " x = self.token(x) + self.pos(pos)\n", " for b in self.blocks:\n", " x = b(x)\n", " return self.head(self.ln(x))\n" ] }, { "cell_type": "code", "execution_count": 19, "id": "c9651bc6", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "c9651bc6", "outputId": "f9ec45fc-c1c6-4fee-907f-7768b8d70810" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Using device: cuda\n" ] } ], "source": [ "import torch\n", "\n", "DEVICE = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", "print(\"Using device:\", DEVICE)\n" ] }, { "cell_type": "code", "execution_count": 20, "id": "c0de4bb0", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "c0de4bb0", "outputId": "a1e105ac-427b-43c9-f1fb-d4eff9d0cd8c" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model parameters: 17.00M\n" ] } ], "source": [ "model = TamilCLM15M().to(DEVICE)\n", "\n", "params = sum(p.numel() for p in model.parameters()) / 1e6\n", "print(f\"Model parameters: {params:.2f}M\")\n" ] }, { "cell_type": "code", "execution_count": 21, "id": "e9e5b321", "metadata": { "id": "e9e5b321" }, "outputs": [], "source": [ "optimizer = torch.optim.AdamW(model.parameters(), lr=LR)\n", "loss_fn = nn.CrossEntropyLoss(ignore_index=PAD_ID)\n" ] }, { "cell_type": "code", "execution_count": 22, "id": "5bf8ac95", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "5bf8ac95", "outputId": "cb9e0032-98da-4aca-f606-2ed3afb3e718" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 653/653 [06:08<00:00, 1.77it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1 | Avg loss: 3.0654\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 653/653 [06:11<00:00, 1.76it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 2 | Avg loss: 0.8621\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 653/653 [06:12<00:00, 1.75it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 3 | Avg loss: 0.6780\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "model.train()\n", "\n", "for epoch in range(EPOCHS):\n", " total_loss = 0\n", "\n", " for batch in tqdm(dataloader):\n", " batch = batch.to(DEVICE)\n", "\n", " x = batch[:, :-1]\n", " y = batch[:, 1:]\n", "\n", " logits = model(x)\n", "\n", " loss = loss_fn(\n", " logits.reshape(-1, logits.size(-1)),\n", " y.reshape(-1)\n", " )\n", "\n", " optimizer.zero_grad()\n", " loss.backward()\n", " optimizer.step()\n", "\n", " total_loss += loss.item()\n", "\n", " print(f\"Epoch {epoch+1} | Avg loss: {total_loss / len(dataloader):.4f}\")\n" ] }, { "cell_type": "code", "execution_count": 23, "id": "e31a8c89", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "e31a8c89", "outputId": "891ce080-da57-47ec-9365-b1d5ff295a5d" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "✅ Base model saved to Drive: /content/drive/MyDrive/Temple_LLM_Artifacts/tamil_clm_15m_base.pt\n" ] } ], "source": [ "BASE_MODEL_PATH = f\"{DRIVE_ROOT}/tamil_clm_15m_base.pt\"\n", "torch.save(model.state_dict(), BASE_MODEL_PATH)\n", "print(\"✅ Base model saved to Drive:\", BASE_MODEL_PATH)\n" ] }, { "cell_type": "code", "execution_count": 24, "id": "dLaoKvNKpjvJ", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "dLaoKvNKpjvJ", "outputId": "c5a1dde9-5fa8-4fa9-cecc-467525489569" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: sentence-transformers in /usr/local/lib/python3.12/dist-packages (5.2.2)\n", "Requirement already satisfied: transformers<6.0.0,>=4.41.0 in /usr/local/lib/python3.12/dist-packages (from sentence-transformers) (4.57.6)\n", "Requirement already satisfied: huggingface-hub>=0.20.0 in /usr/local/lib/python3.12/dist-packages (from sentence-transformers) (0.36.0)\n", "Requirement already satisfied: torch>=1.11.0 in /usr/local/lib/python3.12/dist-packages (from sentence-transformers) (2.9.0+cu126)\n", "Requirement already satisfied: numpy in /usr/local/lib/python3.12/dist-packages (from sentence-transformers) (2.0.2)\n", "Requirement already satisfied: scikit-learn in /usr/local/lib/python3.12/dist-packages (from sentence-transformers) (1.6.1)\n", "Requirement already satisfied: scipy in /usr/local/lib/python3.12/dist-packages (from sentence-transformers) (1.16.3)\n", "Requirement already satisfied: typing_extensions>=4.5.0 in /usr/local/lib/python3.12/dist-packages (from sentence-transformers) (4.15.0)\n", "Requirement already satisfied: tqdm in /usr/local/lib/python3.12/dist-packages (from sentence-transformers) (4.67.1)\n", "Requirement already satisfied: filelock in /usr/local/lib/python3.12/dist-packages (from huggingface-hub>=0.20.0->sentence-transformers) (3.20.3)\n", "Requirement already satisfied: fsspec>=2023.5.0 in /usr/local/lib/python3.12/dist-packages (from huggingface-hub>=0.20.0->sentence-transformers) (2025.3.0)\n", "Requirement already satisfied: packaging>=20.9 in /usr/local/lib/python3.12/dist-packages (from huggingface-hub>=0.20.0->sentence-transformers) (25.0)\n", "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.12/dist-packages (from huggingface-hub>=0.20.0->sentence-transformers) (6.0.3)\n", "Requirement already satisfied: requests in /usr/local/lib/python3.12/dist-packages (from huggingface-hub>=0.20.0->sentence-transformers) (2.32.4)\n", "Requirement already satisfied: hf-xet<2.0.0,>=1.1.3 in /usr/local/lib/python3.12/dist-packages (from huggingface-hub>=0.20.0->sentence-transformers) (1.2.0)\n", "Requirement already satisfied: setuptools in /usr/local/lib/python3.12/dist-packages (from torch>=1.11.0->sentence-transformers) (75.2.0)\n", "Requirement already satisfied: sympy>=1.13.3 in /usr/local/lib/python3.12/dist-packages (from torch>=1.11.0->sentence-transformers) (1.14.0)\n", "Requirement already satisfied: networkx>=2.5.1 in /usr/local/lib/python3.12/dist-packages (from torch>=1.11.0->sentence-transformers) (3.6.1)\n", "Requirement already satisfied: jinja2 in /usr/local/lib/python3.12/dist-packages (from torch>=1.11.0->sentence-transformers) (3.1.6)\n", "Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.6.77 in /usr/local/lib/python3.12/dist-packages (from torch>=1.11.0->sentence-transformers) (12.6.77)\n", "Requirement already satisfied: nvidia-cuda-runtime-cu12==12.6.77 in /usr/local/lib/python3.12/dist-packages (from torch>=1.11.0->sentence-transformers) (12.6.77)\n", "Requirement already satisfied: nvidia-cuda-cupti-cu12==12.6.80 in /usr/local/lib/python3.12/dist-packages (from torch>=1.11.0->sentence-transformers) (12.6.80)\n", "Requirement already satisfied: nvidia-cudnn-cu12==9.10.2.21 in /usr/local/lib/python3.12/dist-packages (from torch>=1.11.0->sentence-transformers) (9.10.2.21)\n", "Requirement already satisfied: nvidia-cublas-cu12==12.6.4.1 in /usr/local/lib/python3.12/dist-packages (from torch>=1.11.0->sentence-transformers) (12.6.4.1)\n", "Requirement already satisfied: nvidia-cufft-cu12==11.3.0.4 in /usr/local/lib/python3.12/dist-packages (from torch>=1.11.0->sentence-transformers) (11.3.0.4)\n", "Requirement already satisfied: nvidia-curand-cu12==10.3.7.77 in /usr/local/lib/python3.12/dist-packages (from torch>=1.11.0->sentence-transformers) (10.3.7.77)\n", "Requirement already satisfied: nvidia-cusolver-cu12==11.7.1.2 in /usr/local/lib/python3.12/dist-packages (from torch>=1.11.0->sentence-transformers) (11.7.1.2)\n", "Requirement already satisfied: nvidia-cusparse-cu12==12.5.4.2 in /usr/local/lib/python3.12/dist-packages (from torch>=1.11.0->sentence-transformers) (12.5.4.2)\n", "Requirement already satisfied: nvidia-cusparselt-cu12==0.7.1 in /usr/local/lib/python3.12/dist-packages (from torch>=1.11.0->sentence-transformers) (0.7.1)\n", "Requirement already satisfied: nvidia-nccl-cu12==2.27.5 in /usr/local/lib/python3.12/dist-packages (from torch>=1.11.0->sentence-transformers) (2.27.5)\n", "Requirement already satisfied: nvidia-nvshmem-cu12==3.3.20 in /usr/local/lib/python3.12/dist-packages (from torch>=1.11.0->sentence-transformers) (3.3.20)\n", "Requirement already satisfied: nvidia-nvtx-cu12==12.6.77 in /usr/local/lib/python3.12/dist-packages (from torch>=1.11.0->sentence-transformers) (12.6.77)\n", "Requirement already satisfied: nvidia-nvjitlink-cu12==12.6.85 in /usr/local/lib/python3.12/dist-packages (from torch>=1.11.0->sentence-transformers) (12.6.85)\n", "Requirement already satisfied: nvidia-cufile-cu12==1.11.1.6 in /usr/local/lib/python3.12/dist-packages (from torch>=1.11.0->sentence-transformers) (1.11.1.6)\n", "Requirement already satisfied: triton==3.5.0 in /usr/local/lib/python3.12/dist-packages (from torch>=1.11.0->sentence-transformers) (3.5.0)\n", "Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.12/dist-packages (from transformers<6.0.0,>=4.41.0->sentence-transformers) (2025.11.3)\n", "Requirement already satisfied: tokenizers<=0.23.0,>=0.22.0 in /usr/local/lib/python3.12/dist-packages (from transformers<6.0.0,>=4.41.0->sentence-transformers) (0.22.2)\n", "Requirement already satisfied: safetensors>=0.4.3 in /usr/local/lib/python3.12/dist-packages (from transformers<6.0.0,>=4.41.0->sentence-transformers) (0.7.0)\n", "Requirement already satisfied: joblib>=1.2.0 in /usr/local/lib/python3.12/dist-packages (from scikit-learn->sentence-transformers) (1.5.3)\n", "Requirement already satisfied: threadpoolctl>=3.1.0 in /usr/local/lib/python3.12/dist-packages (from scikit-learn->sentence-transformers) (3.6.0)\n", "Requirement already satisfied: mpmath<1.4,>=1.1.0 in /usr/local/lib/python3.12/dist-packages (from sympy>=1.13.3->torch>=1.11.0->sentence-transformers) (1.3.0)\n", "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.12/dist-packages (from jinja2->torch>=1.11.0->sentence-transformers) (3.0.3)\n", "Requirement already satisfied: charset_normalizer<4,>=2 in /usr/local/lib/python3.12/dist-packages (from requests->huggingface-hub>=0.20.0->sentence-transformers) (3.4.4)\n", "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.12/dist-packages (from requests->huggingface-hub>=0.20.0->sentence-transformers) (3.11)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.12/dist-packages (from requests->huggingface-hub>=0.20.0->sentence-transformers) (2.5.0)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.12/dist-packages (from requests->huggingface-hub>=0.20.0->sentence-transformers) (2026.1.4)\n" ] } ], "source": [ "pip install sentence-transformers" ] }, { "cell_type": "code", "execution_count": 25, "id": "tC_C6AGqrzcZ", "metadata": { "id": "tC_C6AGqrzcZ" }, "outputs": [], "source": [ "def generate(\n", " prompt,\n", " max_new_tokens=90,\n", " temperature=0.7,\n", " top_k=40,\n", "):\n", " model.eval()\n", " with torch.no_grad():\n", " ids = sp.encode(prompt, out_type=int)\n", " ids = torch.tensor(ids, dtype=torch.long).unsqueeze(0).to(DEVICE)\n", "\n", " for _ in range(max_new_tokens):\n", " if ids.size(1) > MAX_LEN:\n", " ids = ids[:, -MAX_LEN:]\n", "\n", " logits = model(ids)\n", " logits = logits[:, -1, :] / temperature\n", " logits[:, PAD_ID] = -1e9\n", "\n", " v, _ = torch.topk(logits, top_k)\n", " logits[logits < v[:, [-1]]] = -1e9\n", "\n", " probs = torch.softmax(logits, dim=-1)\n", "\n", " # 🔹 light repetition penalty (last 20 tokens)\n", " recent_tokens = ids[0, -20:].tolist()\n", " for tok in set(recent_tokens):\n", " probs[0, tok] *= 0.7\n", "\n", " probs = probs / probs.sum()\n", " next_id = torch.multinomial(probs, 1)\n", " ids = torch.cat([ids, next_id], dim=1)\n", "\n", " return sp.decode(ids[0].tolist())\n" ] }, { "cell_type": "code", "execution_count": 26, "id": "WCfkATyeplwd", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 176, "referenced_widgets": [ "0d3545d605054878b096a4dd008d5e4c", "0a56a7af87674912962f97cc70a0cfd8", "b911898f09164d6797e9f7ea1c049571", "2e35b325cae64d1484462cf712eb0947", "b16fc2fe0a3245a39a6893f76a06039d", "d0e12d0430a8420584a8fd7749526d75", "4368541d03a74edb845dce931283065a", "5f24ba8187d54abd82da0d7b9a9df7aa", "0281c5f913df41e381cdc2303a13391c", "efc3152e16c64a709259ed3acde65aed", "4ade227902a04a1c9c2b0d46dad4c20d" ] }, "id": "WCfkATyeplwd", "outputId": "39423d6b-1aa3-402d-d692-3d03e423cb56" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.12/dist-packages/huggingface_hub/utils/_auth.py:94: UserWarning: \n", "The secret `HF_TOKEN` does not exist in your Colab secrets.\n", "To authenticate with the Hugging Face Hub, create a token in your settings tab (https://huggingface.co/settings/tokens), set it as secret in your Google Colab and restart your session.\n", "You will be able to reuse this secret in all of your notebooks.\n", "Please note that authentication is recommended but still optional to access public models or datasets.\n", " warnings.warn(\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "0d3545d605054878b096a4dd008d5e4c", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Batches: 0%| | 0/98 [00:00 30 and any(s.endswith(e) for e in preferred_endings):\n", " clean.append(s)\n", " if len(clean) == max_sentences:\n", " return \" \".join(clean)\n", "\n", " # Pass 2: relaxed fallback (any reasonably long sentence)\n", " for s in sentences:\n", " s = s.strip()\n", " if len(s) > 40 and s not in clean:\n", " clean.append(s)\n", " if len(clean) == max_sentences:\n", " break\n", "\n", " return \" \".join(clean)\n" ] }, { "cell_type": "code", "execution_count": 29, "id": "59de6a08", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "59de6a08", "outputId": "83389e26-3025-4adc-faa4-1e93d8929076" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "தஞ்சைப் பெருவுடையார் கோயில்\n", "இக்கோயில் திருவிசைப்பா பாடல் பெற்ற தலமாகவும் விளங்குகிறது 1010 ஆம் ஆண்டு வரை சுமார் ஏழு ஆண்டுகளில் கட்டி முடிக்கப்பட்ட இக்கோயில், தமிழர் கட்டிடக்கலையின் உச்சமாகக் கருதப்படுகிறது கோயிலின் விமானம் சுமார் 216 அடி உயரம் கொண்டதாக இருந்து, திராவிடக் கட்டடக்கலையின் சிறந்த எடுத்துக்காட்டாக விளங்குகிறது\n", "\n", "மதுரை மீனாட்சி அம்மன் கோயில்\n", "பிரம்மோத்சவம் என்பது இந்து கோயில்களில் ஆண்டுதோறும் நடைபெறும் முக்கியமான மற்றும் பிரமாண்டமான திருவிழாவாகும் இதனை மஹோத்சவம் அல்லது திருவிழா என்றும் அழைக்கின்றனர் தென்னிந்தியாவில், குறிப்பாக தமிழ்நாடு மற்றும் ஆந்திரப் பிரதேசத்தில் உள்ள பெரிய கோயில்களில், இவ்விழா மிகச் சிறப்பாகக் கொண்டாடப்படுகிறது\n", "\n", "காஞ்சிபுரம் கைலாசநாதர் கோயில்\n", "பல்லவ நாட்டின் பண்டைய தலைநகரம் என்ற சிறப்பைப் பெற்ற, சென்னையில் இருந்து சுமார் 45 மைல்கள் தூரத்தில் அமைந்துள்ள, காஞ்சிபுரத்தில், நகர மத்தியிலிருந்து ஏறத்தாழ ஒரு மைல் தூரத்தில் அமைந்துள்ளது காஞ்சிபுரம் கைலாசநாதர் கோயில் என்பது காஞ்சிபுரம் மாவட்டத்தில் உள்ள தேவார வைப்புத்தலமாகும் பெரிய காஞ்சிபுரம் புத்தேரி தெரு வழியாக சென்று சற்றுத் தொலைவிலுள்ள இக்கோயிலை அடையலாம்\n" ] } ], "source": [ "print(\"தஞ்சைப் பெருவுடையார் கோயில்\")\n", "print(generate_clean_text(\n", " \"தஞ்சைப் பெருவுடையார் கோயில்\",\n", " texts,\n", " corpus_embeddings\n", "))\n", "\n", "print(\"\\nமதுரை மீனாட்சி அம்மன் கோயில்\")\n", "print(generate_clean_text(\n", " \"மதுரை மீனாட்சி அம்மன் கோயில்\",\n", " texts,\n", " corpus_embeddings\n", "))\n", "\n", "print(\"\\nகாஞ்சிபுரம் கைலாசநாதர் கோயில்\")\n", "print(generate_clean_text(\n", " \"காஞ்சிபுரம் கைலாசநாதர் கோயில்\",\n", " texts,\n", " corpus_embeddings\n", "))" ] }, { "cell_type": "code", "execution_count": 30, "id": "5f70b466", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "5f70b466", "outputId": "ad5fce2d-1526-42ae-ff39-75bad3966b6e" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Using device: cuda\n" ] } ], "source": [ "import os\n", "import json\n", "import torch\n", "import torch.nn as nn\n", "from torch.utils.data import Dataset, DataLoader\n", "import sentencepiece as spm\n", "from tqdm import tqdm\n", "\n", "DEVICE = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", "print(\"Using device:\", DEVICE)\n" ] }, { "cell_type": "code", "execution_count": 31, "id": "8e29627d", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "8e29627d", "outputId": "ece2e3d6-854f-46fa-b050-25a3c8be0e28" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Documents: 3124\n" ] } ], "source": [ "DATA_DIR = \"/content/temple_dataset\"\n", "\n", "def load_texts(data_dir):\n", " texts = []\n", " for path in glob(f\"{data_dir}/**/*.json\", recursive=True):\n", " try:\n", " data = json.load(open(path, \"r\", encoding=\"utf-8\"))\n", " items = data if isinstance(data, list) else [data]\n", " for obj in items:\n", " t = obj.get(\"text\") or obj.get(\"content\") or \"\"\n", " if isinstance(t, str) and len(t) > 300:\n", " texts.append(t)\n", " except:\n", " continue\n", " return texts\n", "\n", "texts = load_texts(DATA_DIR)\n", "print(\"Documents:\", len(texts))\n" ] }, { "cell_type": "code", "execution_count": 32, "id": "f2a73502", "metadata": { "id": "f2a73502" }, "outputs": [], "source": [ "class CausalSelfAttention(nn.Module):\n", " def __init__(self, dim, heads):\n", " super().__init__()\n", " self.heads = heads\n", " self.head_dim = dim // heads\n", " self.scale = self.head_dim ** -0.5\n", "\n", " self.qkv = nn.Linear(dim, dim * 3)\n", " self.out = nn.Linear(dim, dim)\n", "\n", " def forward(self, x):\n", " B, T, C = x.shape\n", " q, k, v = self.qkv(x).chunk(3, dim=-1)\n", "\n", " q = q.view(B, T, self.heads, self.head_dim).transpose(1, 2)\n", " k = k.view(B, T, self.heads, self.head_dim).transpose(1, 2)\n", " v = v.view(B, T, self.heads, self.head_dim).transpose(1, 2)\n", "\n", " att = (q @ k.transpose(-2, -1)) * self.scale\n", " mask = torch.tril(torch.ones(T, T, device=x.device))\n", " att = att.masked_fill(mask == 0, -1e9)\n", " att = att.softmax(dim=-1)\n", "\n", " out = (att @ v).transpose(1, 2).reshape(B, T, C)\n", " return self.out(out)\n", "\n", "\n", "class Block(nn.Module):\n", " def __init__(self, dim, heads):\n", " super().__init__()\n", " self.ln1 = nn.LayerNorm(dim)\n", " self.ln2 = nn.LayerNorm(dim)\n", " self.attn = CausalSelfAttention(dim, heads)\n", " self.ff = nn.Sequential(\n", " nn.Linear(dim, 4 * dim),\n", " nn.SiLU(),\n", " nn.Linear(4 * dim, dim)\n", " )\n", "\n", " def forward(self, x):\n", " x = x + self.attn(self.ln1(x))\n", " x = x + self.ff(self.ln2(x))\n", " return x\n", "\n", "\n", "class TamilCLM15M(nn.Module):\n", " def __init__(self):\n", " super().__init__()\n", " self.token = nn.Embedding(VOCAB_SIZE, 384)\n", " self.pos = nn.Embedding(MAX_LEN, 384)\n", "\n", " # ✅ MUST be 6 blocks (not 8)\n", " self.blocks = nn.ModuleList([Block(384, 6) for _ in range(6)])\n", "\n", " self.ln = nn.LayerNorm(384)\n", " self.head = nn.Linear(384, VOCAB_SIZE)\n", "\n", " def forward(self, x):\n", " B, T = x.shape\n", " pos = torch.arange(T, device=x.device)\n", " x = self.token(x) + self.pos(pos)\n", " for b in self.blocks:\n", " x = b(x)\n", " return self.head(self.ln(x))\n", "\n" ] }, { "cell_type": "code", "execution_count": 33, "id": "2c82b8b8", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "2c82b8b8", "outputId": "43a45e69-8299-433d-bd45-0cb32ea62d85" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Loaded base model: 17.00M params\n" ] } ], "source": [ "model = TamilCLM15M().to(DEVICE)\n", "model.load_state_dict(torch.load(\"/content/tamil_clm_15m_base.pt\", map_location=DEVICE))\n", "\n", "params = sum(p.numel() for p in model.parameters()) / 1e6\n", "print(f\"Loaded base model: {params:.2f}M params\")\n" ] }, { "cell_type": "code", "execution_count": 34, "id": "bf89b2a8", "metadata": { "id": "bf89b2a8" }, "outputs": [], "source": [ "def extract_text_and_name(obj):\n", " name = \"\"\n", " text = \"\"\n", "\n", " if isinstance(obj, dict):\n", " name = (\n", " obj.get(\"temple_name\")\n", " or obj.get(\"name\")\n", " or obj.get(\"title\")\n", " or \"\"\n", " )\n", "\n", " text = (\n", " obj.get(\"text\")\n", " or obj.get(\"content\")\n", " or obj.get(\"description\")\n", " or \"\"\n", " )\n", "\n", " return name.strip(), text.strip()\n", "\n", "\n", "def chunk_text(text, max_chars=800, min_chars=200):\n", " chunks = []\n", " start = 0\n", " while start < len(text):\n", " chunk = text[start:start + max_chars]\n", " if len(chunk) >= min_chars:\n", " chunks.append(chunk)\n", " start += max_chars\n", " return chunks\n" ] }, { "cell_type": "code", "execution_count": 35, "id": "hcBjsiMJgjFK", "metadata": { "id": "hcBjsiMJgjFK" }, "outputs": [], "source": [ "import random\n", "from glob import glob\n", "from torch.utils.data import Dataset, DataLoader" ] }, { "cell_type": "code", "execution_count": 36, "id": "Jy85QmqchaHj", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Jy85QmqchaHj", "outputId": "6a78594b-4690-4868-b543-a35a5037d04b" }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# load tokenizer\n", "sp = spm.SentencePieceProcessor()\n", "sp.load(\"tamil_clm.model\")\n", "\n", "# load base model\n", "model = TamilCLM15M().to(DEVICE)\n", "model.load_state_dict(torch.load(\"tamil_clm_15m_base.pt\", map_location=DEVICE))" ] }, { "cell_type": "code", "execution_count": 37, "id": "w5NXBUx9hdrK", "metadata": { "id": "w5NXBUx9hdrK" }, "outputs": [], "source": [ "def chunk_text(text, max_chars=700):\n", " return [\n", " text[i:i+max_chars]\n", " for i in range(0, len(text), max_chars)\n", " if len(text[i:i+max_chars]) > 300\n", " ]" ] }, { "cell_type": "code", "execution_count": 38, "id": "tn_ZP3XFjgCb", "metadata": { "id": "tn_ZP3XFjgCb" }, "outputs": [], "source": [ "def build_instruction_samples(data_dir):\n", " samples = []\n", "\n", " for path in glob(f\"{data_dir}/**/*.json\", recursive=True):\n", " try:\n", " data = json.load(open(path, \"r\", encoding=\"utf-8\"))\n", " except:\n", " continue\n", "\n", " objs = data if isinstance(data, list) else [data]\n", "\n", " for obj in objs:\n", " text = obj.get(\"text\") or obj.get(\"content\") or \"\"\n", " name = obj.get(\"temple_name\") or obj.get(\"name\") or \"\"\n", "\n", " if len(text) < 400:\n", " continue\n", "\n", " # split long text into paragraphs\n", " chunks = chunk_text(text, max_chars=900)\n", "\n", " for chunk in chunks:\n", " samples.append(f\"\"\"### வழிமுறை:\n", "கோயிலை பற்றி விரிவாக விளக்கவும்\n", "\n", "### உள்ளீடு:\n", "{name}\n", "\n", "### பதில்:\n", "{chunk}\n", "\"\"\")\n", "\n", " return samples\n" ] }, { "cell_type": "code", "execution_count": 39, "id": "04KPCNGihgUs", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "04KPCNGihgUs", "outputId": "67115cb5-9b42-43dc-f1b7-e5ddb8a7076f" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Instruction samples: 8000\n" ] } ], "source": [ "instruction_texts = build_instruction_samples(DATA_DIR)\n", "instruction_texts = random.sample(\n", " instruction_texts,\n", " min(8000, len(instruction_texts))\n", ")\n", "\n", "print(\"Instruction samples:\", len(instruction_texts))" ] }, { "cell_type": "code", "execution_count": 40, "id": "hhqEuAMLhjvL", "metadata": { "id": "hhqEuAMLhjvL" }, "outputs": [], "source": [ "class InstructionDataset(Dataset):\n", " def __init__(self, texts):\n", " self.samples = []\n", "\n", " for t in texts:\n", " if \"### பதில்:\" not in t:\n", " continue\n", "\n", " prompt, answer = t.split(\"### பதில்:\", 1)\n", "\n", " if len(answer.strip()) < 5:\n", " continue\n", "\n", " full = prompt + \"### பதில்:\" + answer\n", "\n", " ids = sp.encode(full, out_type=int)[:MAX_LEN]\n", " prompt_ids = sp.encode(prompt + \"### பதில்:\", out_type=int)\n", " if len(prompt_ids) >= len(ids) - 1:\n", " continue\n", "\n", " labels = [-100] * len(prompt_ids) + ids[len(prompt_ids):]\n", " labels = labels[:len(ids)]\n", "\n", " self.samples.append(\n", " (torch.tensor(ids), torch.tensor(labels))\n", " )\n", "\n", "\n", " def __len__(self):\n", " return len(self.samples)\n", "\n", " def __getitem__(self, idx):\n", " return self.samples[idx]\n", "\n", "def collate_fn(batch):\n", " max_len = max(len(x[0]) for x in batch)\n", " x = torch.full((len(batch), max_len), 3)\n", " y = torch.full((len(batch), max_len), -100)\n", "\n", " for i, (ids, labels) in enumerate(batch):\n", " x[i, :len(ids)] = ids\n", " y[i, :len(labels)] = labels\n", "\n", " return x.long(), y.long()\n", "\n", "loader = DataLoader(\n", " InstructionDataset(instruction_texts),\n", " batch_size=8,\n", " shuffle=True,\n", " collate_fn=collate_fn\n", ")" ] }, { "cell_type": "code", "execution_count": 41, "id": "rVgE1cdohok0", "metadata": { "id": "rVgE1cdohok0" }, "outputs": [], "source": [ "optimizer = torch.optim.AdamW(model.parameters(), lr=5e-5)\n", "loss_fn = nn.CrossEntropyLoss(ignore_index=-100)" ] }, { "cell_type": "code", "execution_count": 42, "id": "dmZeCTzbhrfz", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "dmZeCTzbhrfz", "outputId": "67350ec6-b764-49f8-d84e-1a471d578b27" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 1000/1000 [01:14<00:00, 13.37it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "IFT Epoch 1 | Loss: 1.0241\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 1000/1000 [01:15<00:00, 13.16it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "IFT Epoch 2 | Loss: 0.0904\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 1000/1000 [01:15<00:00, 13.30it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "IFT Epoch 3 | Loss: 0.0383\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "model.train()\n", "for epoch in range(3):\n", " total = 0\n", " for x, y in tqdm(loader):\n", " x, y = x.to(DEVICE), y.to(DEVICE)\n", " logits = model(x)\n", " loss = loss_fn(logits.view(-1, VOCAB_SIZE), y.view(-1))\n", " if torch.isnan(loss):\n", " continue\n", " optimizer.zero_grad()\n", " loss.backward()\n", " optimizer.step()\n", "\n", " total += loss.item()\n", "\n", " print(f\"IFT Epoch {epoch+1} | Loss: {total/len(loader):.4f}\")\n" ] }, { "cell_type": "code", "execution_count": 43, "id": "bRpQGtN1hwQO", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "bRpQGtN1hwQO", "outputId": "ad22c2f4-b441-4094-db96-ecc600ef6910" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "✅ Instruction-tuned model saved to Drive: /content/drive/MyDrive/Temple_LLM_Artifacts/tamil_clm_15m_instruction.pt\n" ] } ], "source": [ "IFT_MODEL_PATH = f\"{DRIVE_ROOT}/tamil_clm_15m_instruction.pt\"\n", "torch.save(model.state_dict(), IFT_MODEL_PATH)\n", "print(\"✅ Instruction-tuned model saved to Drive:\", IFT_MODEL_PATH)\n" ] }, { "cell_type": "code", "execution_count": null, "id": "f950e35c", "metadata": { "id": "f950e35c" }, "outputs": [], "source": [ "@torch.no_grad()\n", "def generate(\n", " prompt,\n", " max_new_tokens=180,\n", " temperature=0.6,\n", " top_k=30,\n", " repetition_penalty=1.4,\n", " no_repeat_ngram_size=3\n", "):\n", " model.eval()\n", "\n", " ids = sp.encode(prompt, out_type=int)\n", " x = torch.tensor([ids], device=DEVICE)\n", "\n", " generated = []\n", "\n", " for _ in range(max_new_tokens):\n", " logits = model(x)[:, -1, :]\n", " logits = logits / temperature\n", "\n", " # --- repetition penalty (global) ---\n", " for tok in set(generated):\n", " logits[0, tok] /= repetition_penalty\n", "\n", " # --- top-k filtering ---\n", " values, _ = torch.topk(logits, top_k)\n", " logits[logits < values[:, [-1]]] = -1e9\n", "\n", " probs = torch.softmax(logits, dim=-1)\n", " next_id = torch.multinomial(probs, 1)\n", "\n", " # --- no-repeat n-gram blocking ---\n", " if len(generated) >= no_repeat_ngram_size:\n", " ngram = tuple(generated[-(no_repeat_ngram_size-1):] + [next_id.item()])\n", " recent = [\n", " tuple(generated[i:i+no_repeat_ngram_size])\n", " for i in range(len(generated)-no_repeat_ngram_size+1)\n", " ]\n", " if ngram in recent:\n", " continue\n", "\n", " generated.append(next_id.item())\n", " x = torch.cat([x, next_id], dim=1)\n", "\n", " if next_id.item() == sp.eos_id():\n", " break\n", "\n", " return sp.decode(ids + generated)\n" ] }, { "cell_type": "code", "execution_count": 45, "id": "NbMxEgnCkyQ-", "metadata": { "id": "NbMxEgnCkyQ-" }, "outputs": [], "source": [ "def retrieve_long_text(temple_name, texts, max_chars=1200):\n", " key = temple_name.replace(\" \", \"\")\n", " for t in texts:\n", " if key in t.replace(\" \", \"\"):\n", " return t[:max_chars]\n", " return None\n" ] }, { "cell_type": "code", "execution_count": 46, "id": "4KXu6i0hl4xt", "metadata": { "id": "4KXu6i0hl4xt" }, "outputs": [], "source": [ "import re\n", "\n", "def finish_properly(text):\n", " \"\"\"\n", " Ensures the text ends at a complete sentence.\n", " \"\"\"\n", " # Tamil + English sentence endings\n", " sentence_endings = re.finditer(r\"[.!?।]\", text)\n", "\n", " last_end = None\n", " for match in sentence_endings:\n", " last_end = match.end()\n", "\n", " if last_end is not None:\n", " return text[:last_end].strip()\n", "\n", " return text.strip()\n" ] }, { "cell_type": "code", "execution_count": 47, "id": "cNqs6-mVk0ED", "metadata": { "id": "cNqs6-mVk0ED" }, "outputs": [], "source": [ "def answer_temple(temple_name, texts):\n", " raw = retrieve_long_text(temple_name, texts)\n", "\n", " if raw is None:\n", " return \"இந்த கோயில் பற்றிய தகவல் தரவுத்தளத்தில் இல்லை.\"\n", "\n", " # ✅ Finish cleanly\n", " return finish_properly(raw)\n" ] }, { "cell_type": "code", "execution_count": 48, "id": "LgfjeglEk_bn", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "LgfjeglEk_bn", "outputId": "cee275ed-ac35-41b7-ba2f-8311fc7e6d66" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "தஞ்சைப் பெருவுடையார் கோயில் அல்லது தஞ்சைப் பெரிய கோயில் என அழைக்கப்படும் இத்தலம், தஞ்சாவூரில் காவிரி ஆற்றின் தென்கரையில் அமைந்துள்ள ஒரு முக்கியமான சிவன் கோயிலாகும். இக்கோயில் திருவிசைப்பா பாடல் பெற்ற தலமாகவும் விளங்குகிறது. சோழப் பேரரசர் முதலாம் இராசராச சோழனால் பொ.ஊ. 1003 ஆம் ஆண்டு தொடங்கி பொ.ஊ. 1010 ஆம் ஆண்டு வரை சுமார் ஏழு ஆண்டுகளில் கட்டி முடிக்கப்பட்ட இக்கோயில், தமிழர் கட்டிடக்கலையின் உச்சமாகக் கருதப்படுகிறது.\n", "\n", "இக்கோயிலின் மூலவர் பெருவுடையார் அல்லது பிரகதீசுவரர் ஆவார். தாயார் பெரியநாயகி அம்மன். கோயிலின் விமானம் சுமார் 216 அடி உயரம் கொண்டதாக இருந்து, திராவிடக் கட்டடக்கலையின் சிறந்த எடுத்துக்காட்டாக விளங்குகிறது. ஒரே காலகட்டத்தில் முழுமையாக திட்டமிடப்பட்ட இந்தக் கோயில், கருவறை, மகாமண்டபம், அர்த்தமண்டபம், நந்தி மண்டபம், சுற்றுச்சுவர், கோபுரம் ஆகிய அனைத்தையும் ஒருங்கிணைந்த வடிவில் கொண்டுள்ளது.\n", "\n", "தஞ்சைப் பெருவுடையார் கோயில் உலகப் பாரம்பரியச் சின்னமாக 1987 ஆம் ஆண்டு யுனெஸ்கோவால் அறிவிக்கப்பட்டது. அழியாத சோழர் பெருங்கோயில்கள் எனப்படும் தொகுப்பில் தஞ்சை பெருவுடையார் கோயில், கங்கைகொண்ட சோழீசுவரர் கோயில், தாராசுரம் ஐராவதேசுவரர் கோயில் ஆகிய மூன்று கோயில்களும் இடம்பெற்றுள்ளன.\n" ] } ], "source": [ "print(answer_temple(\n", " \"தஞ்சைப் பெருவுடையார் கோயில்\",\n", " texts\n", "))\n" ] }, { "cell_type": "code", "execution_count": 50, "id": "6aepZGXSlgTR", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "6aepZGXSlgTR", "outputId": "4a07f87d-0672-4c37-96a5-f49c53fb1144" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Saving all artifacts to: /content/drive/MyDrive/temple_model_bundle\n", "✔ Base model saved\n", "✔ Instruction model saved\n", "✔ Tokenizer saved: tamil_clm.model\n", "✔ Tokenizer saved: tamil_clm.vocab\n", "✔ texts.json saved\n", "ZIP READY: /content/drive/MyDrive/temple_model_bundle_20260201.zip\n" ] } ], "source": [ "import os\n", "import shutil\n", "import json\n", "import torch\n", "from datetime import datetime\n", "\n", "BASE_DIR = \"/content/drive/MyDrive/temple_model_bundle\"\n", "os.makedirs(BASE_DIR, exist_ok=True)\n", "\n", "print(\"Saving all artifacts to:\", BASE_DIR)\n", "\n", "# --- Base model ---\n", "if os.path.exists(\"tamil_clm_15m_base.pt\"):\n", " shutil.copy(\"tamil_clm_15m_base.pt\", BASE_DIR)\n", " print(\"✔ Base model saved\")\n", "\n", "# --- Instruction-tuned model ---\n", "if os.path.exists(\"tamil_clm_15m_instruction.pt\"):\n", " shutil.copy(\"tamil_clm_15m_instruction.pt\", BASE_DIR)\n", " print(\"✔ Instruction model saved\")\n", "\n", "# --- Tokenizer ---\n", "for f in [\"tamil_clm.model\", \"tamil_clm.vocab\"]:\n", " if os.path.exists(f):\n", " shutil.copy(f, BASE_DIR)\n", " print(f\"✔ Tokenizer saved: {f}\")\n", "\n", "# --- Corpus text (optional, but useful) ---\n", "if \"texts\" in globals():\n", " with open(os.path.join(BASE_DIR, \"texts.json\"), \"w\", encoding=\"utf-8\") as f:\n", " json.dump(texts, f, ensure_ascii=False, indent=2)\n", " print(\"✔ texts.json saved\")\n", "\n", "# --- ZIP ---\n", "timestamp = datetime.now().strftime(\"%Y%m%d\")\n", "ZIP_PATH = f\"/content/drive/MyDrive/temple_model_bundle_{timestamp}.zip\"\n", "\n", "shutil.make_archive(\n", " ZIP_PATH.replace(\".zip\", \"\"),\n", " \"zip\",\n", " BASE_DIR\n", ")\n", "\n", "print(\"ZIP READY:\", ZIP_PATH)\n" ] }, { "cell_type": "code", "execution_count": 1, "id": "ffk_bAjOpZmU", "metadata": { "id": "ffk_bAjOpZmU" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Using device: cpu\n" ] } ], "source": [ "import torch\n", "import torch.nn as nn\n", "import torch.nn.functional as F\n", "import sentencepiece as spm\n", "import json\n", "import re\n", "\n", "DEVICE = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", "print(\"Using device:\", DEVICE)\n" ] }, { "cell_type": "code", "execution_count": 2, "id": "b4dcd35d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tokenizer loaded | vocab size: 8000\n" ] } ], "source": [ "TOKENIZER_PATH = r\"C:\\Users\\Dinesh\\Downloads\\temple_model_bundle_20260201 2\\temple_model_bundle_20260201\\tamil_clm.model\"\n", "\n", "sp = spm.SentencePieceProcessor()\n", "sp.load(TOKENIZER_PATH)\n", "\n", "VOCAB_SIZE = sp.get_piece_size()\n", "MAX_LEN = 512\n", "\n", "print(\"Tokenizer loaded | vocab size:\", VOCAB_SIZE)\n" ] }, { "cell_type": "code", "execution_count": 3, "id": "394825de", "metadata": {}, "outputs": [], "source": [ "class CausalSelfAttention(nn.Module):\n", " def __init__(self, dim, heads):\n", " super().__init__()\n", " self.heads = heads\n", " self.head_dim = dim // heads\n", " self.scale = self.head_dim ** -0.5\n", " self.qkv = nn.Linear(dim, dim * 3)\n", " self.out = nn.Linear(dim, dim)\n", "\n", " def forward(self, x):\n", " B, T, C = x.shape\n", " q, k, v = self.qkv(x).chunk(3, dim=-1)\n", "\n", " q = q.view(B, T, self.heads, self.head_dim).transpose(1, 2)\n", " k = k.view(B, T, self.heads, self.head_dim).transpose(1, 2)\n", " v = v.view(B, T, self.heads, self.head_dim).transpose(1, 2)\n", "\n", " att = (q @ k.transpose(-2, -1)) * self.scale\n", " mask = torch.tril(torch.ones(T, T, device=x.device))\n", " att = att.masked_fill(mask == 0, -1e9).softmax(dim=-1)\n", "\n", " out = (att @ v).transpose(1, 2).reshape(B, T, C)\n", " return self.out(out)\n", "\n", "\n", "class Block(nn.Module):\n", " def __init__(self, dim, heads):\n", " super().__init__()\n", " self.ln1 = nn.LayerNorm(dim)\n", " self.ln2 = nn.LayerNorm(dim)\n", " self.attn = CausalSelfAttention(dim, heads)\n", " self.ff = nn.Sequential(\n", " nn.Linear(dim, 4 * dim),\n", " nn.SiLU(),\n", " nn.Linear(4 * dim, dim)\n", " )\n", "\n", " def forward(self, x):\n", " x = x + self.attn(self.ln1(x))\n", " x = x + self.ff(self.ln2(x))\n", " return x\n", "\n", "\n", "class TamilCLM15M(nn.Module):\n", " def __init__(self):\n", " super().__init__()\n", " self.token = nn.Embedding(VOCAB_SIZE, 384)\n", " self.pos = nn.Embedding(MAX_LEN, 384)\n", " self.blocks = nn.ModuleList([Block(384, 6) for _ in range(6)])\n", " self.ln = nn.LayerNorm(384)\n", " self.head = nn.Linear(384, VOCAB_SIZE)\n", "\n", " def forward(self, x):\n", " B, T = x.shape\n", " pos = torch.arange(T, device=x.device)\n", " x = self.token(x) + self.pos(pos)\n", " for b in self.blocks:\n", " x = b(x)\n", " return self.head(self.ln(x))\n" ] }, { "cell_type": "code", "execution_count": 4, "id": "904118b0", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Instruction model loaded | 17.00M params\n" ] } ], "source": [ "MODEL_PATH = r\"C:\\Users\\Dinesh\\Downloads\\temple_model_bundle_20260201 2\\temple_model_bundle_20260201\\tamil_clm_15m_instruction.pt\"\n", "\n", "model = TamilCLM15M().to(DEVICE)\n", "model.load_state_dict(torch.load(MODEL_PATH, map_location=DEVICE))\n", "model.eval()\n", "\n", "params = sum(p.numel() for p in model.parameters()) / 1e6\n", "print(f\"Instruction model loaded | {params:.2f}M params\")\n" ] }, { "cell_type": "code", "execution_count": 7, "id": "349a6a0f", "metadata": {}, "outputs": [], "source": [ "@torch.no_grad()\n", "def generate(\n", " prompt,\n", " max_new_tokens=180,\n", " temperature=0.6,\n", " top_k=30,\n", " repetition_penalty=1.4,\n", " no_repeat_ngram_size=3\n", "):\n", " model.eval()\n", "\n", " ids = sp.encode(prompt, out_type=int)\n", " x = torch.tensor([ids], device=DEVICE)\n", "\n", " generated = []\n", "\n", " for _ in range(max_new_tokens):\n", " logits = model(x)[:, -1, :]\n", " logits = logits / temperature\n", "\n", " # --- repetition penalty (global) ---\n", " for tok in set(generated):\n", " logits[0, tok] /= repetition_penalty\n", "\n", " # --- top-k filtering ---\n", " values, _ = torch.topk(logits, top_k)\n", " logits[logits < values[:, [-1]]] = -1e9\n", "\n", " probs = torch.softmax(logits, dim=-1)\n", " next_id = torch.multinomial(probs, 1)\n", "\n", " # --- no-repeat n-gram blocking ---\n", " if len(generated) >= no_repeat_ngram_size:\n", " ngram = tuple(generated[-(no_repeat_ngram_size-1):] + [next_id.item()])\n", " recent = [\n", " tuple(generated[i:i+no_repeat_ngram_size])\n", " for i in range(len(generated)-no_repeat_ngram_size+1)\n", " ]\n", " if ngram in recent:\n", " continue\n", "\n", " generated.append(next_id.item())\n", " x = torch.cat([x, next_id], dim=1)\n", "\n", " if next_id.item() == sp.eos_id():\n", " break\n", "\n", " return sp.decode(ids + generated)\n" ] }, { "cell_type": "code", "execution_count": 8, "id": "deafb472", "metadata": {}, "outputs": [], "source": [ "def retrieve_long_text(temple_name, texts, max_chars=1200):\n", " key = temple_name.replace(\" \", \"\")\n", " for t in texts:\n", " if key in t.replace(\" \", \"\"):\n", " return t[:max_chars]\n", " return None\n" ] }, { "cell_type": "code", "execution_count": 9, "id": "889f5988", "metadata": {}, "outputs": [], "source": [ "import re\n", "\n", "def finish_properly(text):\n", " \"\"\"\n", " Ensures the text ends at a complete sentence.\n", " \"\"\"\n", " # Tamil + English sentence endings\n", " sentence_endings = re.finditer(r\"[.!?।]\", text)\n", "\n", " last_end = None\n", " for match in sentence_endings:\n", " last_end = match.end()\n", "\n", " if last_end is not None:\n", " return text[:last_end].strip()\n", "\n", " return text.strip()\n" ] }, { "cell_type": "code", "execution_count": 10, "id": "9889e2e7", "metadata": {}, "outputs": [], "source": [ "def answer_temple(temple_name, texts):\n", " raw = retrieve_long_text(temple_name, texts)\n", "\n", " if raw is None:\n", " return \"இந்த கோயில் பற்றிய தகவல் தரவுத்தளத்தில் இல்லை.\"\n", "\n", " # ✅ Finish cleanly\n", " return finish_properly(raw)\n" ] }, { "cell_type": "code", "execution_count": 12, "id": "4efb010b", "metadata": {}, "outputs": [], "source": [ "texts = r\"C:\\Users\\Dinesh\\Downloads\\temple_model_bundle_20260201 2\\temple_model_bundle_20260201\\texts.json\"" ] }, { "cell_type": "code", "execution_count": 16, "id": "6d1811b8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "இந்த கோயில் பற்றிய தகவல் தரவுத்தளத்தில் இல்லை.\n" ] } ], "source": [ "print(answer_temple(\n", " \"தஞ்சைப் பெருவுடையார் கோயில்\",\n", " texts\n", "))\n" ] }, { "cell_type": "code", "execution_count": 17, "id": "ca515495", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "தஞ்சைப் பெருவுடையார் கோயில்\n" ] }, { "ename": "NameError", "evalue": "name 'generate_clean_text' is not defined", "output_type": "error", "traceback": [ "\u001b[31m---------------------------------------------------------------------------\u001b[39m", "\u001b[31mNameError\u001b[39m Traceback (most recent call last)", "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[17]\u001b[39m\u001b[32m, line 2\u001b[39m\n\u001b[32m 1\u001b[39m \u001b[38;5;28mprint\u001b[39m(\u001b[33m\"\u001b[39m\u001b[33mதஞ்சைப் பெருவுடையார் கோயில்\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m----> \u001b[39m\u001b[32m2\u001b[39m \u001b[38;5;28mprint\u001b[39m(\u001b[43mgenerate_clean_text\u001b[49m(\n\u001b[32m 3\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mதஞ்சைப் பெருவுடையார் கோயில்\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m 4\u001b[39m texts,\n\u001b[32m 5\u001b[39m corpus_embeddings\n\u001b[32m 6\u001b[39m ))\n", "\u001b[31mNameError\u001b[39m: name 'generate_clean_text' is not defined" ] } ], "source": [ "print(\"தஞ்சைப் பெருவுடையார் கோயில்\")\n", "print(generate_clean_text(\n", " \"தஞ்சைப் பெருவுடையார் கோயில்\",\n", " texts,\n", " corpus_embeddings\n", "))" ] }, { "cell_type": "code", "execution_count": null, "id": "af1fa95a", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "accelerator": "GPU", "colab": { "gpuType": "T4", "provenance": [] }, "kernelspec": { "display_name": "tamil-llm", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.14" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "0281c5f913df41e381cdc2303a13391c": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "" } }, "0a56a7af87674912962f97cc70a0cfd8": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_d0e12d0430a8420584a8fd7749526d75", "placeholder": "​", "style": "IPY_MODEL_4368541d03a74edb845dce931283065a", "value": "Batches: 100%" } }, "0d3545d605054878b096a4dd008d5e4c": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_0a56a7af87674912962f97cc70a0cfd8", "IPY_MODEL_b911898f09164d6797e9f7ea1c049571", "IPY_MODEL_2e35b325cae64d1484462cf712eb0947" ], "layout": "IPY_MODEL_b16fc2fe0a3245a39a6893f76a06039d" } }, "2e35b325cae64d1484462cf712eb0947": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_efc3152e16c64a709259ed3acde65aed", "placeholder": "​", "style": "IPY_MODEL_4ade227902a04a1c9c2b0d46dad4c20d", "value": " 98/98 [00:53<00:00, 16.59it/s]" } }, "4368541d03a74edb845dce931283065a": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "4ade227902a04a1c9c2b0d46dad4c20d": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "5f24ba8187d54abd82da0d7b9a9df7aa": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "b16fc2fe0a3245a39a6893f76a06039d": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "b911898f09164d6797e9f7ea1c049571": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_5f24ba8187d54abd82da0d7b9a9df7aa", "max": 98, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_0281c5f913df41e381cdc2303a13391c", "value": 98 } }, "d0e12d0430a8420584a8fd7749526d75": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "efc3152e16c64a709259ed3acde65aed": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } } } } }, "nbformat": 4, "nbformat_minor": 5 }