Sunday, June 16, 2024

 This is a continuation of a study involving a software application that responds to a chat like query on the data contained in the ten-year collection of my blog posts from https://ravinote.blogspot.com. Each article collected on the blog post is a daily routine and contains mostly unstructured text on quality explanations of software engineering practices and code samples from personal, enterprise and cloud computing. The earlier part of the study referred to leveraging Azure OpenAI search service to perform a semantic search based on the chat like query to create a generated response. This part of the study follows up on taking the data completely private so that the model built to respond to the query can be hosted on any lightweight compute including handheld devices using mobile browsers. The lessons learned in this section now follows:

First, a brief introduction of the comparison of the search methodologies between the two: 

1. Azure AI Toolkit for VS Code:

o Approach: This simplifies generative AI app development by bringing together AI tools and models from Azure AI catalog. We specifically use the Phi-2 small language model. It also helps to fine-tune and deploy models to the cloud.

o Matching: It matches based on similarity between query vectors and content vectors. This enables matching across semantic or conceptual likeness (e.g., “dog” and “canine”). Phi-2 is a 2.7 billion-parameter language model not the order of trillions in large language model but sufficiently compact to demonstrate outstanding reasoning and language understanding capabilities. Phi-2 is a Transformer based model with a next-word prediction objective that was originally trained on a large mixture of synthetic datasets for NLP and coding. 

o Scenarios Supported: 

Find a supported model from the Model Catalog.

Test model inference in the Model Playground.

Fine-Tune model locally or remotely in Model Fine-tuning

Deploy fine-tuned models to cloud via command-palette for AI Toolkit.

o Integration: Works seamlessly with other Azure services.

2. Azure OpenAI Service-Based Search:

o Approach: Uses the Azure OpenAI embedding model such as GPT-models to convert queries into vector embeddings. GPT-models are large language models while Phi-2 models are small language models. The dataset can include the web for the Chat Completions API from Azure OpenAI service. 

o Matching: Performs vector similarity search using the query vector in the vector database usually based on the top k-matching content based on a defined similarity threshold.

o Scenarios supported: 

Similarity search: Encode text using embedding models (e.g., OpenAI embeddings) and retrieve documents with encoded queries.

Hybrid search: Execute vector and keyword queries in the same request, merging results.

Filtered vector search: Combine vector queries with filter expressions.

o Cost:

increases linearly even for infrequent use at the rate of few-hundred dollars per month. The earlier application leveraging completion API had to be taken down for this reason.

Both approaches leverage vector embeddings for search, but toolkit and Phi-2 model are better for customizations while Azure OpenAI Completions API is useful for streamlined applications and quick chatbots.

And now the learnings follow:

- Fine-Tuning: A pretrained transformer can be put to different use during fine-tuning such as question-answering, language generation, sentiment analysis, summarization, and others. Fine-tuning adapts the model to different domains. Phi-2 behaves remarkably well in this regard. Fine-tuning LLMs are so cost prohibitive that it can be avoided. On the other hand, small language models are susceptible to overfitting where the model learns specifics of the training data that cannot be applied to the query.

- Parameter-Efficient Fine-tuning: This is called out here only for rigor. Costs for tuning LLMs can be reduced by fine-tuning only a subset of the model’s parameter but it might result in “catastrophic forgetting”. These techniques include LoRA, prefix tuning and prompt tuning. The Azure Toolkit leverages QLoRA. LoRA stands for Low-Rank Adaptation of Large Language Models and introduces trainable rank decomposition matrices into each layer of transformer architecture. It also reduces trainable parameters for downstream tasks while keeping the pre-trained weights frozen. QLoRA combines quantization with LORA with quantization data types to use as one of nf4 (4-bit normal float) or fp4 and adjustable batch size for training and evaluation per GPU. The data type is for compression to 4-bit precision as opposed to native floating-point-32-bit precision.

- Problem with outliers:  As with all neural networks that create embeddings, outliers are significant because while model weights are normally distributed, the inclusion of outliers directly affects the quality of the model. Iterative study involving different range of inclusions was too expensive to include in the study.

- Dequantization – this is the process of taking quantized weights which are frozen and not trained to be dequantized back to 32-bit precision. It is helpful to inference when quantized values and quantization constant can be used to backpropagate calculated gradients.

- Paged optimizers are necessary to manage memory usage during training of the language models. Azure NC4AS_T4_v3 family VMs handle this well but choice of sku is in initial decision not something that we can change during flight.

- BlobFuseV2 to load all the data stored in private storage accounts as local filesystem is incredibly slow for read over this entire dataset. Toolkit is more helpful to run on notebooks and laptops with VS Code, GPU, and customized local Windows Sub-system for Linux.


Saturday, June 15, 2024

 

Drone Formation Commercial Software:

This is another addendum to the discussion about Drone Formation Commercial Software as described in this document. In this section, we describe surface detection. Drones can help with surface detection by using an encompassing space around the surface to detect. Let us assume that an object, say saucer like, needs to be surrounded by drones. The points of reference along the object as positions around which the drones must organize themselves can be easily determined by the drones themselves. We further assume each drone can detect the distance to the object by themselves or passed to each drone from some central sensor in real-time. If the scouts can figure out the overall matrix of X-Y-Z coordinates that is sufficiently large enough to encompass the object, then the rest of the drones can make use of this initial grid to spread themselves out before each converges to a point of reference closest to it and independent of others as long as it safe and not colliding with other drones.

The scouts do a two-pass flyover the objects while the distance remains within a range. If the range is exceeded, the boundary of the encompassing grid is known. With the initial pass determining the grid a subsequent pass to converge as close as possible to the surface of the object while maintaining a distance from each other, helps the drone to determine the points of reference on the surface. With the full strength of the drone formation then spreading over and distributing themselves against the points of reference will help to cover the surface.

When the number of drones is in excess of those required to cover the surface, they can form ever-increasing layers over the underlying points of reference. These points adjust to be on one layer for the layer above and the logic remains the same for additional drones to work out the new positions to occupy. Wave propagation and Fourier transform can predict how soon the drones can cover the object or the number of layers to form and the rate or duration for full coverage by all the drones.

Distance from each other as well as to a point of reference is sensor-specific and merely translates as an input for the drone to determine the actual position to occupy as the output. This works for all stationary objects in an outward-grid-enclosing-on-to-the-surface-of-the-object manner for the drone formation. Selection of the initial number and identities of the drones for the scouts can be determined by a threshold for the maximum distance allowed for a scout. After a scout reaches this threshold, another scout covers the next interval to the allowed threshold.

Moving objects have the characteristics that their shape remains constant during the flight and if the end points for the object can be tracked as distinct positions over time, then they the frame of reference can be adjusted to include the initial and final positions for a given time slice.

Friday, June 14, 2024

 This is the summary of the book titled “The art of explanation” written by Ros Atkins and published by Headline Publishing in 2023. He has been serving as the analysis editor for BBC and contends that the ability to explain oneself well is a necessary art. To be clear and concise at once takes practice and one that can be worked on each day. It applies to relationships. job interviews, email writing, teaching children and engaging any audience and is thus immeasurably useful and fortunately learnable. Crafting a quality explanation starts with the right questions, a certain degree of familiarity with the audience and their needs, preparations for controlled environments, and even training for impromptu speeches. Verbalizing and memorizing ahead of time helps. Anticipating and soliciting feedback helps to refine. Short form is preferable but the ability to delve in depth on demand is also important. Practice in everyday life can be transformational.

Explanation is a crucial skill that many people lack, as it can significantly impact how they communicate and achieve their goals. It is essential to convey our message clearly and impactfully, as it increases the likelihood of being understood and achieving desired results. For example, entrepreneurs can attract investors by explaining their business models, teachers can enhance students' enjoyment by explaining complex information, patients can stick to diet plans by explaining their benefits, and government agencies can gain interest in their services by explaining how to access them. To craft a quality explanation, we must start with the right questions and master the art of explanation by addressing 10 key features: simplicity, essential detail, complexity, efficiency, precision, context, no distractions, engaging, useful, and clarity of purpose.

To create a memorable and engaging message, it is essential to understand our audience and our needs. This involves understanding demographics, age ranges, and what they already know and want to know. Crafting a bespoke message that resonates with our audience and applying oour knowledge to engage them are essential. Lastly, communicating our credibility on the subject matter wraps it up.


Preparation is crucial for effective explanations. In controlled scenarios, these seven steps can be followed:

1. Set-up: Clarify our audience and the purpose of our explanation.

2. Find the information: Gather information, including a summary, questions, research areas, and subject matter.

3. Distill the information: Filter out irrelevant elements and evaluate the data.

4. Organize the information: Divide it into strands or sections, focusing on high-impact elements or stories.

5. Link the information: Write down our first draft to ensure smooth flow and authenticity.

6. Tighten the explanation: Eliminate unnecessary elements and practice thoroughly.

7. Deliver the explanation: Rehearse our explanation thoroughly, using methods like reading from a script, flashcards, or memorizing. Record ourselves running through the explanation and address any gaps.

In uncontrolled situations also, it is essential to prepare and communicate clearly. Following the same steps as for controlled settings, including setting up, finding information, and distilling the information helps. In dynamic settings, organizing our information differently, with no more than five strands. Each strand should have a primary point, three supporting facts, and relevant context. Verbalizing and memorizing our dynamic explanation ahead of time, using bridging phrases to connect different elements and communicating our desired information seamlessly will have a tremendous impact. Practicing using memory techniques, such as creating a "memory palace" to visualize different strands of our explanation aids our retention. Anticipating questions or feedback others might have regarding our explanation, as people tend to be predictable and pattern-based, helps cover our base. Preparing for the worst-case scenario by imagining how we might respond if the roles were reversed is good preparation. We could preemptively formulate answers and research the situation before giving our explanation. This will help us prepare for both what we hope will happen and what may surprise us.

We must prepare for short-form explanations in just a couple of minutes by asking ourselves three questions before an interaction that requires an explanation. This will help us include the right details and make the conversation more engaging. Even with short emails, it's good for everyone to understand our message clearly. We must make your first sentence and subject line engaging and use formatting to highlight important details. We must avoid adding recipients who don't need to be included in the conversation. The art of explanation is a multifaceted process that must be adaptable to our unique circumstances. It's like a home chef testing recipes from a cookbook, and we can choose which aspects of our life to transform first with the art of explanation.

Previous book summary: BookSummary107.docx

Summarizing Software: SummarizerCodeSnippets.docx  



Thursday, June 13, 2024

 This is a continuation of articles on IaC shortcomings and resolutions. The following article describes how data scientists leveraging the cloud infrastructure tend to think about individual files and archives rather than filesystems. Most data used by data scientists to train their models either lives in a remote blob store, filestore or some form of data store such as structured and unstructured databases and virtual data warehouses. Distributed file systems in operating systems and intercompatibility protocols between heterogeneous operating systems such as Linux and Windows have long addressed the problem of viewing remote file systems as local paths via mounts and mapped drives, yet the diligence to setup and tear down entire filesystems on local compute instances and clusters is often ignored. 

Part of the reason for such limited use of files and archives has been the popularity of signed URIs for remote files that facilitate sharing on a file-by-file basis as well as the adoption of new file formats like parquet and zip archives for convenient data transfer. When changes are made to these files, they often require unpacking and packing and one-time update at the remote location. 

With the convenience of BlobFuse2 technology, mounted file systems can persist changes to remote location near instantaneously and are available for blob stores just as much as the technology is available for file stores. BlobFuse is a virtual system driver for Azure Blob Storage. It can be used to access existing blob data through the Linux File system. Page blobs are not supported. It uses libfuse open-source library to connect to the Linux FUSE kernel module. It implements filesystem operations by using Azure Storage REST APIs. Local file caching improves subsequent access times. An azure blob container on a remote Azure Data Lake Storage Gen 2 file system is mounted on Linux and its activities and resource usage can be monitored. The version 2 provides more management support through the Command-Line Interface  

On the other hand, the Azure File Storage offers fileshares in the cloud using the standard SMB protocol. Enterprise applications that rely on fileservers can find this transition easier. File shares can be mounted even from virtual machines running in Azure and on-premises applications that support SMB 3.0.

To mount the file share from a virtual machine running Linux, an SMB/CIFS client needs to be installed and if the distribution does not have a built-in client, it can be installed with the cifs-utils package. Then a mount command can be specified to make a mount point by giving the type, remote location, options, and local path as parameters. Mount shares can be persisted across reboots by adding a setting in the /etc/fstab file.

Lastly, as with all cloud resources and operations, all activities can be logged and monitored. They come with role-based access control for one-time setup and control plane operations can be automated with command-line interface, REST API calls, user-interface automations, and Software Development Kits in various languages.

Previous write-up: IaCResolutionsPart135.docx


Wednesday, June 12, 2024

 


Problem::

Make Array Zero by Subtracting Equal Amounts

You are given a non-negative integer array nums. In one operation, you must:

Choose a positive integer x such that x is less than or equal to the smallest non-zero element in nums.

Subtract x from every positive element in nums.

Return the minimum number of operations to make every element in nums equal to 0.

 

Example 1:

Input: nums = [1,5,0,3,5]

Output: 3

Explanation:

In the first operation, choose x = 1. Now, nums = [0,4,0,2,4].

In the second operation, choose x = 2. Now, nums = [0,2,0,0,2].

In the third operation, choose x = 2. Now, nums = [0,0,0,0,0].

Example 2:

Input: nums = [0]

Output: 0

Explanation: Each element in nums is already 0 so no operations are needed.

 

Constraints:

1 <= nums.length <= 100

0 <= nums[i] <= 100


import java.util.*;

import java.util.stream.*;

class Solution {

    public int minimumOperations(int[] nums) {

        List<Integer> list = Arrays.stream(nums).boxed().collect(Collectors.toList());

        var nonZero = list.stream().filter(x -> x > 0).collect(Collectors.toList());

        int count = 0;

        while(nonZero.size() > 0) {

            var min = nonZero.stream().mapToInt(x -> x).min().getAsInt();

            nonZero = nonZero.stream().map(x -> x - min).filter(x -> x > 0).collect(Collectors.toList());

            count++;

        }

        return count;

    }

}


Input

nums =

[1,5,0,3,5]

Output

3

Expected

3


Input

nums =

[0]

Output

0

Expected

0




SQL Schema

 

Table: Books

+----------------+---------+

| Column Name    | Type    |

+----------------+---------+

| book_id        | int     |

| name           | varchar |

| available_from | date    |

+----------------+---------+

book_id is the primary key of this table.

 

Table: Orders

+----------------+---------+

| Column Name    | Type    |

+----------------+---------+

| order_id       | int     |

| book_id        | int     |

| quantity       | int     |

| dispatch_date  | date    |

+----------------+---------+

order_id is the primary key of this table.

book_id is a foreign key to the Books table.

 

Write an SQL query that reports the books that have sold less than 10 copies in the last year, excluding books that have been available for less than one month from today. Assume today is 2019-06-23.

Return the result table in any order.

The query result format is in the following example.

 

Example 1:

Input: 

Books table:

+---------+--------------------+----------------+

| book_id | name               | available_from |

+---------+--------------------+----------------+

| 1       | "Kalila And Demna" | 2010-01-01     |

| 2       | "28 Letters"       | 2012-05-12     |

| 3       | "The Hobbit"       | 2019-06-10     |

| 4       | "13 Reasons Why"   | 2019-06-01     |

| 5       | "The Hunger Games" | 2008-09-21     |

+---------+--------------------+----------------+

Orders table:

+----------+---------+----------+---------------+

| order_id | book_id | quantity | dispatch_date |

+----------+---------+----------+---------------+

| 1        | 1       | 2        | 2018-07-26    |

| 2        | 1       | 1        | 2018-11-05    |

| 3        | 3       | 8        | 2019-06-11    |

| 4        | 4       | 6        | 2019-06-05    |

| 5        | 4       | 5        | 2019-06-20    |

| 6        | 5       | 9        | 2009-02-02    |

| 7        | 5       | 8        | 2010-04-13    |

+----------+---------+----------+---------------+

Output: 

+-----------+--------------------+

| book_id   | name               |

+-----------+--------------------+

| 1         | "Kalila And Demna" |

| 2         | "28 Letters"       |

| 5         | "The Hunger Games" |

+-----------+--------------------+



SELECT DISTINCT b.book_id, b.name

FROM books b 

LEFT JOIN Orders o on b.book_id = o.book_id

GROUP BY b.book_id, b.name, 

DATEDIFF(day, DATEADD(year, -1, '2019-06-23'), o.dispatch_date),  

DATEDIFF(day,  b.available_from, DATEADD(month, -1, '2019-06-23')) 

HAVING SUM(o.quantity) IS NULL OR 

DATEDIFF(day, DATEADD(year, -1, '2019-06-23'), o.dispatch_date) < 0 OR 

(DATEDIFF(day, DATEADD(year, -1, '2019-06-23'), o.dispatch_date) > 0 AND DATEDIFF(day,  b.available_from, DATEADD(month, -1, '2019-06-23')) > 0 AND SUM(o.quantity) < 10);



Case 1

Input

Books =

| book_id | name | available_from |

| ------- | ---------------- | -------------- |

| 1 | Kalila And Demna | 2010-01-01 |

| 2 | 28 Letters | 2012-05-12 |

| 3 | The Hobbit | 2019-06-10 |

| 4 | 13 Reasons Why | 2019-06-01 |

| 5 | The Hunger Games | 2008-09-21 |

Orders =

| order_id | book_id | quantity | dispatch_date |

| -------- | ------- | -------- | ------------- |

| 1 | 1 | 2 | 2018-07-26 |

| 2 | 1 | 1 | 2018-11-05 |

| 3 | 3 | 8 | 2019-06-11 |

| 4 | 4 | 6 | 2019-06-05 |

| 5 | 4 | 5 | 2019-06-20 |

| 6 | 5 | 9 | 2009-02-02 |

| 7 | 5 | 8 | 2010-04-13 |

Output

| book_id | name |

| ------- | ---------------- |

| 2 | 28 Letters |

| 1 | Kalila And Demna |

| 5 | The Hunger Games |

Expected

| book_id | name |

| ------- | ---------------- |

| 1 | Kalila And Demna |

| 2 | 28 Letters |

| 5 | The Hunger Games |




 This is a continuation of articles on IaC shortcomings and resolutions. As a recap of several articles, this section brings to light what has worked and what hasn’t across a diverse and complex set of deployments. 

1. Cloud is our friend in its ability to provide management free, elastic, performant and highly available resources that can be reached from around the world. Transition from on-premises while requiring migration and modernization concerns are not insurmountable and the final state as cloud native deployments is very appealing in the long run.

2. Resources transition from preview to general acceptance as various cloud services become more mainstream. Since they are developed and made generally available independent of each other, many mature and lower the users concerns in their usage. Leveraging these built-in features over customizations holds us in good stead as it is maintenance free.

3. Anything managed is good including networks, storage and compute if the resource or set of resources to be deployed give that option. Taking the example of an Azure Machine Learning Workspace over an Azure Databricks instance, storage accounts, key vaults, managed virtual network are tightly integrated with the managed option and eschews rediscovery by hands-on configuration.

4. Complex deployments have a significant number of configuration parameters that can quickly get out of hand and require a large test matrix. Capturing them in Infrastructure-as-code with source control is helpful to both repeatable deployments as well as curating best practices.

5. The final state of the resources on their deployment must meet all the criteria so instead of working through the order of various steps and getting lost in the choices, it is better to work backwards from the final state once that has gained deliberation and buy-ins from stakeholders.

6. Zonal redundancy and regional disaster recovery are aspects that must be considered as early as design and implementation. They are not an afterthought and must be judiciously chosen to conserver resources and costs without detriment to the business continuity

7. Most workspaces and resources with public ip connectivity grow feet in the form of private endpoints to gain private plane connectivity through virtual networks so that the connectivity and traffic are secured and there is less attack surface from the ubiquitous internet. Designating subnets for providing addresses to private endpoints from various resources is good practice. Only when private connectivity interferes with usage of resources via workspace notebooks or management views and requires jump hosts or Bastions, then both public and private connectivity might be required. For public connectivity alone, simple firewall rules to enumerate the source and destinations can thwart many attacks that might require otherwise have required costly setup like Defender

8. Cost is always a concern as they have a tendency to balloon with usage and keeping them nanageable requires attention to features that are used and those that aren’t and the process must be repeated at setup as well as an ongoing basis.

9. Just like built-in features, most resources come with diagnostics, troubleshooting and documentation as well as support, so leveraging them avoids lengthy investigations.

10. Naming convention is important to capture the variations possible to resources and do very weill with prefixes and suffixes that have well-known meanings.  Previous articles: https://1drv.ms/w/s!Ashlm-Nw-wnWhO8w-_97Fxz2IyBZog?e=R3wwt0 

Tuesday, June 11, 2024

 This is the summary of the book titled “Connectable” written by Steven Van Cohen and Ryan Jenkins and published by McGraw Hill in 2022.  The authors are speakers and consultants with their website lesslonely.com who talk about tech induced loneliness for individuals and teams in the workplace. Isolation’s negative consequences while poignant can be overcome by adjustments to daily behavior and human connection. The impact of loneliness goes beyond the workplace to include society’s foundation and technology with its priority for convenience over connection, has exacerbated it. Kindness is the perfect antidote for loneliness and it can be done in small measures to begin with.

Loneliness is a growing issue in the workforce, affecting employee productivity, loyalty, collaboration, and engagement. Loneliness reduces life expectancy by 15 years, with 70% of workers experiencing loneliness monthly and 55% weekly. Technology, such as ATMs and self-checkouts, often prioritizes convenience over connection, leading to a decline in social interaction. Researchers classify loneliness into three dimensions: intimate, relational, and collective. Intimate loneliness is characterized by the absence of significant support, while relational loneliness is characterized by the absence of friendships and family relationships. Collective loneliness is characterized by the lack of connection to a community or social network, with men playing a slightly larger role. Technology is not inherently evil, but it can be a tool for promoting loneliness and reducing social interaction.

Loneliness significantly impacts people's physical and mental health, increasing the chances of dying young by 45%. Around 60% of American adults report being lonely, up 7% since 2018. Gen Z, the younger generation, suffers the most from loneliness, with nearly 70% feeling significantly stressed about the future. Employers must prioritize psychological wellness and address crippling loneliness. Gen Z prefers face-to-face communication at work, and even brief interactions with others can reduce loneliness and create a greater sense of happiness.


Loneliness has doubled since the 1980s, and COVID-19 has exacerbated this trend. Surveys show that three times as many Americans have no close friends than in 1985. Loneliness spreads through social networks, and loneliness can manifest at work when a lonely colleague becomes more withdrawn and less approachable.


Kindness is the ideal remedy for loneliness, as it is contagious and can make an impression on others. Examples of kindness include Aaron Le Conte's free hugs in London, which have led to glowing smiles from onlookers.

Loneliness is a common issue that has emerged in recent years, with new causes such as being busy, technologically sabotaging, and relying on technology. People today face more distractions than in previous eras, with people rushing to meetings and appointments, sacrificing face-to-face interactions, and relying too much on social media. The rise of Google has also impacted human connections, as people can find helpful and convenient resources online, but it can chip away at human connections. People today are more impatient, prioritizing speedy transactions, which weakens social bonds. The growing remote work phenomenon, fueled by mobile technology and COVID-19, has led to a preference for working at home for a day per week. The no-stopping lane of work has also become more prevalent, with people constantly checking emails and texting at all hours. Leaders can address disconnection by understanding its components and addressing the challenges it presents.

The modern work environment has led to a lack of time for social connections and human interaction, resulting in feelings of loneliness and disconnection among employees. The "Less Loneliness Framework" suggests that leaders can address loneliness by making subtle adjustments that reinforce or reestablish the team's well-being. The framework has four steps: "Look at loneliness," "Invest in connection," "Narrow the focus," and "Kindle the momentum."


Loneliness is a natural part of human nature, and leaders can make adjustments to improve their connection with their team. By slowing down, recognizing signs of loneliness, investing in connection, narrowing the focus, and ensuring shared meaning among team members, leaders can create a more supportive and productive work environment. By implementing these strategies, leaders can help their employees feel better and boost their organization's overall quality.

Previous book summaries: https://1drv.ms/w/s!Ashlm-Nw-wnWhO84QQt9vMkqdWZL_w?e=gdStFw

Summarizing Software: SummarizerCodeSnippets.docx